From: Deadbeef Date: Mon, 21 Jun 2021 20:15:13 +0000 (+0800) Subject: Do not list impl when trait has doc(hidden) X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=bd7caf477c8e77f0db286c3fd59d7708b3176fdc;p=rust.git Do not list impl when trait has doc(hidden) --- diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 111827aacdf..db2e0d0d241 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -1,5 +1,6 @@ //! Support for inlining external documentation into the current AST. +use std::collections::VecDeque; use std::iter::once; use std::sync::Arc; @@ -15,7 +16,9 @@ use rustc_span::symbol::{kw, sym, Symbol}; use rustc_span::Span; -use crate::clean::{self, Attributes, AttributesExt, FakeDefId, GetDefId, ToSource}; +use crate::clean::{ + self, Attributes, AttributesExt, FakeDefId, GetDefId, NestedAttributesExt, ToSource, Type, +}; use crate::core::DocContext; use crate::formats::item_type::ItemType; @@ -420,6 +423,20 @@ fn merge_attrs( if trait_.def_id() == tcx.lang_items().deref_trait() { super::build_deref_target_impls(cx, &trait_items, ret); } + + // Return if the trait itself or any types of the generic parameters are doc(hidden). + let mut deque: VecDeque<&Type> = trait_.iter().collect(); + while let Some(ty) = deque.pop_back() { + if let Some(did) = ty.def_id() { + if cx.tcx.get_attrs(did).lists(sym::doc).has_word(sym::hidden) { + return; + } + } + if let Some(generics) = ty.generics() { + deque.extend(generics); + } + } + if let Some(trait_did) = trait_.def_id() { record_extern_trait(cx, trait_did); } diff --git a/src/test/rustdoc/auxiliary/cross-crate-hidden.rs b/src/test/rustdoc/auxiliary/cross-crate-hidden.rs new file mode 100644 index 00000000000..ec0ced2a82d --- /dev/null +++ b/src/test/rustdoc/auxiliary/cross-crate-hidden.rs @@ -0,0 +1,2 @@ +#[doc(hidden)] +pub enum HiddenType {} diff --git a/src/test/rustdoc/cross-crate-hidden.rs b/src/test/rustdoc/cross-crate-hidden.rs new file mode 100644 index 00000000000..b1bfc7c49bf --- /dev/null +++ b/src/test/rustdoc/cross-crate-hidden.rs @@ -0,0 +1,23 @@ +// Issue #86448: test for cross-crate `doc(hidden)` +#![crate_name = "foo"] + +// aux-build:cross-crate-hidden.rs +extern crate cross_crate_hidden; + +pub use ::cross_crate_hidden::HiddenType; // OK, not re-exported + +pub enum MyLibType {} + +// @!has foo/enum.MyLibType.html '//*[@id="impl-From%3CHiddenType%3E"]' 'impl From for MyLibType' +impl From for MyLibType { + fn from(it: HiddenType) -> MyLibType { + match it {} + } +} + +// @!has foo/enum.MyLibType.html '//*[@id="impl-From%3COption%3COption%3COption%3COption%3CHiddenType%3E%3E%3E%3E%3E"]' 'impl From>>>> for MyLibType' +impl From>>>> for MyLibType { + fn from(it: Option>>>) -> MyLibType { + todo!() + } +}