rustdoc: use stability, instead of features, to decide what to show

To decide if internal items should be inlined in a doc page,
check if the crate is itself internal, rather than if it has
the rustc_private feature flag. The standard library uses
internal items, but is not itself internal and should not show
internal items on its docs pages.
This commit is contained in:
Michael Howell 2024-05-07 15:24:44 -07:00
parent faefc618cf
commit 6d6f67a98c
4 changed files with 42 additions and 34 deletions

View File

@ -14,6 +14,7 @@
use rustc_metadata::creader::{CStore, LoadedMacro}; use rustc_metadata::creader::{CStore, LoadedMacro};
use rustc_middle::ty::fast_reject::SimplifiedType; use rustc_middle::ty::fast_reject::SimplifiedType;
use rustc_middle::ty::{self, TyCtxt}; use rustc_middle::ty::{self, TyCtxt};
use rustc_span::def_id::LOCAL_CRATE;
use rustc_span::hygiene::MacroKind; use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Symbol}; use rustc_span::symbol::{kw, sym, Symbol};
@ -444,25 +445,25 @@ pub(crate) fn build_impl(
let associated_trait = tcx.impl_trait_ref(did).map(ty::EarlyBinder::skip_binder); let associated_trait = tcx.impl_trait_ref(did).map(ty::EarlyBinder::skip_binder);
// Do not inline compiler-internal items unless we're a compiler-internal crate.
let is_compiler_internal = |did| {
tcx.lookup_stability(did)
.is_some_and(|stab| stab.is_unstable() && stab.feature == sym::rustc_private)
};
let document_compiler_internal = is_compiler_internal(LOCAL_CRATE.as_def_id());
let is_directly_public = |cx: &mut DocContext<'_>, did| {
cx.cache.effective_visibilities.is_directly_public(tcx, did)
&& (document_compiler_internal || !is_compiler_internal(did))
};
// Only inline impl if the implemented trait is // Only inline impl if the implemented trait is
// reachable in rustdoc generated documentation // reachable in rustdoc generated documentation
if !did.is_local() if !did.is_local()
&& let Some(traitref) = associated_trait && let Some(traitref) = associated_trait
{ && !is_directly_public(cx, traitref.def_id)
let did = traitref.def_id;
if !cx.cache.effective_visibilities.is_directly_public(tcx, did) {
return;
}
if !tcx.features().rustc_private && !cx.render_options.force_unstable_if_unmarked {
if let Some(stab) = tcx.lookup_stability(did)
&& stab.is_unstable()
&& stab.feature == sym::rustc_private
{ {
return; return;
} }
}
}
let impl_item = match did.as_local() { let impl_item = match did.as_local() {
Some(did) => match &tcx.hir().expect_item(did).kind { Some(did) => match &tcx.hir().expect_item(did).kind {
@ -484,22 +485,12 @@ pub(crate) fn build_impl(
// Only inline impl if the implementing type is // Only inline impl if the implementing type is
// reachable in rustdoc generated documentation // reachable in rustdoc generated documentation
if !did.is_local() { if !did.is_local()
if let Some(did) = for_.def_id(&cx.cache) { && let Some(did) = for_.def_id(&cx.cache)
if !cx.cache.effective_visibilities.is_directly_public(tcx, did) { && !is_directly_public(cx, did)
return;
}
if !tcx.features().rustc_private && !cx.render_options.force_unstable_if_unmarked {
if let Some(stab) = tcx.lookup_stability(did)
&& stab.is_unstable()
&& stab.feature == sym::rustc_private
{ {
return; return;
} }
}
}
}
let document_hidden = cx.render_options.document_hidden; let document_hidden = cx.render_options.document_hidden;
let predicates = tcx.explicit_predicates_of(did); let predicates = tcx.explicit_predicates_of(did);

View File

@ -285,8 +285,6 @@ pub(crate) struct RenderOptions {
pub(crate) no_emit_shared: bool, pub(crate) no_emit_shared: bool,
/// If `true`, HTML source code pages won't be generated. /// If `true`, HTML source code pages won't be generated.
pub(crate) html_no_source: bool, pub(crate) html_no_source: bool,
/// Whether `-Zforce-unstable-if-unmarked` unstable option is set
pub(crate) force_unstable_if_unmarked: bool,
} }
#[derive(Copy, Clone, Debug, PartialEq, Eq)] #[derive(Copy, Clone, Debug, PartialEq, Eq)]
@ -353,7 +351,6 @@ pub(crate) fn from_matches(
let codegen_options = CodegenOptions::build(early_dcx, matches); let codegen_options = CodegenOptions::build(early_dcx, matches);
let unstable_opts = UnstableOptions::build(early_dcx, matches); let unstable_opts = UnstableOptions::build(early_dcx, matches);
let force_unstable_if_unmarked = unstable_opts.force_unstable_if_unmarked;
let dcx = new_dcx(error_format, None, diagnostic_width, &unstable_opts); let dcx = new_dcx(error_format, None, diagnostic_width, &unstable_opts);
@ -790,7 +787,6 @@ fn println_condition(condition: Condition) {
call_locations, call_locations,
no_emit_shared: false, no_emit_shared: false,
html_no_source, html_no_source,
force_unstable_if_unmarked,
}; };
Some((options, render_options)) Some((options, render_options))
} }

View File

@ -1,6 +1,8 @@
//@ aux-build:issue-76736-1.rs //@ aux-build:issue-76736-1.rs
//@ aux-build:issue-76736-2.rs //@ aux-build:issue-76736-2.rs
// https://github.com/rust-lang/rust/issues/124635
#![crate_name = "foo"] #![crate_name = "foo"]
#![feature(rustc_private)] #![feature(rustc_private)]
@ -8,9 +10,9 @@
extern crate issue_76736_2; extern crate issue_76736_2;
// @has foo/struct.Foo.html // @has foo/struct.Foo.html
// @has - '//*[@class="impl"]//h3[@class="code-header"]' 'MaybeResult' // @!has - '//*[@class="impl"]//h3[@class="code-header"]' 'MaybeResult'
pub struct Foo; pub struct Foo;
// @has foo/struct.Bar.html // @has foo/struct.Bar.html
// @has - '//*[@class="impl"]//h3[@class="code-header"]' 'MaybeResult' // @!has - '//*[@class="impl"]//h3[@class="code-header"]' 'MaybeResult'
pub use issue_76736_2::Bar; pub use issue_76736_2::Bar;

View File

@ -0,0 +1,19 @@
//@ aux-build:issue-76736-1.rs
//@ aux-build:issue-76736-2.rs
// https://github.com/rust-lang/rust/issues/124635
#![crate_name = "foo"]
#![feature(rustc_private, staged_api)]
#![unstable(feature = "rustc_private", issue = "none")]
extern crate issue_76736_1;
extern crate issue_76736_2;
// @has foo/struct.Foo.html
// @has - '//*[@class="impl"]//h3[@class="code-header"]' 'MaybeResult'
pub struct Foo;
// @has foo/struct.Bar.html
// @has - '//*[@class="impl"]//h3[@class="code-header"]' 'MaybeResult'
pub use issue_76736_2::Bar;