rustdoc: treat allowed_through_unstable_modules as deprecation

This ensures `std::intrinsics::transmute` is deemphasized
in the search engine and other UI, by cleaning it into a deprecation
without propagating it through reexports when the parent module
is stable.
This commit is contained in:
Michael Howell 2025-01-02 11:58:15 -07:00
parent 6ca66598ad
commit c7cb8224e2
5 changed files with 45 additions and 3 deletions

View file

@ -400,7 +400,27 @@ impl Item {
}
pub(crate) fn deprecation(&self, tcx: TyCtxt<'_>) -> Option<Deprecation> {
self.def_id().and_then(|did| tcx.lookup_deprecation(did))
self.def_id().and_then(|did| tcx.lookup_deprecation(did)).or_else(|| {
// `allowed_through_unstable_modules` is a bug-compatibility hack for old rustc
// versions; the paths that are exposed through it are "deprecated" because they
// were never supposed to work at all.
let stab = self.stability(tcx)?;
if let rustc_attr_parsing::StabilityLevel::Stable {
allowed_through_unstable_modules: true,
..
} = stab.level
{
Some(Deprecation {
// FIXME(#131676, #135003): when a note is added to this stability tag,
// translate it here
since: rustc_attr_parsing::DeprecatedSince::Unspecified,
note: None,
suggestion: None,
})
} else {
None
}
})
}
pub(crate) fn inner_docs(&self, tcx: TyCtxt<'_>) -> bool {

View file

@ -107,6 +107,15 @@ fn merge_stability(
|| parent_stab.stable_since().is_some_and(|parent_since| parent_since > own_since))
{
parent_stability
} else if let Some(mut own_stab) = own_stability
&& let StabilityLevel::Stable { since, allowed_through_unstable_modules: true } =
own_stab.level
&& let Some(parent_stab) = parent_stability
&& parent_stab.is_stable()
{
// this property does not apply transitively through re-exports
own_stab.level = StabilityLevel::Stable { since, allowed_through_unstable_modules: false };
Some(own_stab)
} else {
own_stability
}