From ff46d116c1fec1a1ceb988e0e31263c00a5d521b Mon Sep 17 00:00:00 2001 From: Nixon Enraght-Moony Date: Fri, 6 Jan 2023 17:57:03 +0000 Subject: [PATCH] rustdoc: Strip imports of items which are `#[doc(hidden)]` Closes #106379 --- src/librustdoc/clean/types.rs | 11 +++++++++++ src/librustdoc/passes/stripper.rs | 1 + src/test/rustdoc-json/doc_hidden_failure.rs | 3 ++- .../rustdoc-json/reexport/pub_use_doc_hidden.rs | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/test/rustdoc-json/reexport/pub_use_doc_hidden.rs diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 6d55a6794f581..827afafbba3b6 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -2494,6 +2494,17 @@ impl Import { pub(crate) fn new_glob(source: ImportSource, should_be_displayed: bool) -> Self { Self { kind: ImportKind::Glob, source, should_be_displayed } } + + pub(crate) fn imported_item_is_doc_hidden(&self, tcx: TyCtxt<'_>) -> bool { + match self.source.did { + Some(did) => tcx + .get_attrs(did, sym::doc) + .filter_map(ast::Attribute::meta_item_list) + .flatten() + .has_word(sym::hidden), + None => false, + } + } } #[derive(Clone, Debug)] diff --git a/src/librustdoc/passes/stripper.rs b/src/librustdoc/passes/stripper.rs index bf111133b9f7f..f8a0d77538d39 100644 --- a/src/librustdoc/passes/stripper.rs +++ b/src/librustdoc/passes/stripper.rs @@ -248,6 +248,7 @@ pub(crate) struct ImportStripper<'tcx> { impl<'tcx> DocFolder for ImportStripper<'tcx> { fn fold_item(&mut self, i: Item) -> Option { match *i.kind { + clean::ImportItem(imp) if imp.imported_item_is_doc_hidden(self.tcx) => None, clean::ExternCrateItem { .. } | clean::ImportItem(..) if i.visibility(self.tcx) != Some(Visibility::Public) => { diff --git a/src/test/rustdoc-json/doc_hidden_failure.rs b/src/test/rustdoc-json/doc_hidden_failure.rs index 6573166c47f22..0d2c6b2209bd1 100644 --- a/src/test/rustdoc-json/doc_hidden_failure.rs +++ b/src/test/rustdoc-json/doc_hidden_failure.rs @@ -14,7 +14,8 @@ mod auto { } } -// @count "$.index[*][?(@.name=='builders')]" 2 +// @count "$.index[*][?(@.name=='builders')]" 1 +// @has "$.index[*][?(@.name == 'ActionRowBuilder')"] pub use auto::*; pub mod builders { diff --git a/src/test/rustdoc-json/reexport/pub_use_doc_hidden.rs b/src/test/rustdoc-json/reexport/pub_use_doc_hidden.rs new file mode 100644 index 0000000000000..a2a25d08448a3 --- /dev/null +++ b/src/test/rustdoc-json/reexport/pub_use_doc_hidden.rs @@ -0,0 +1,15 @@ +// Regression test for + +#![feature(no_core)] +#![no_core] + +mod repeat_n { + #[doc(hidden)] + pub struct RepeatN {} +} + +pub use repeat_n::RepeatN; + +// @count "$.index[*][?(@.name=='pub_use_doc_hidden')].inner.items[*]" 0 +// @!has "$.index[*][?(@.kind=='struct')]" +// @!has "$.index[*][?(@.kind=='import')]"