| // Regression test for <https://github.com/rust-lang/rust/issues/154694>. | |
| // The goal is to ensure that declarative macros re-exported by name | |
| // inherit the `#[doc(inline)]` attribute from intermediate re-exports, | |
| // matching the behavior of glob re-exports. | |
| #![crate_name = "foo"] | |
| #[macro_use] | |
| mod macros { | |
| #[macro_export] | |
| #[doc(hidden)] | |
| macro_rules! explicit_macro { | |
| () => {}; | |
| } | |
| #[macro_export] | |
| #[doc(hidden)] | |
| macro_rules! wild_macro { | |
| () => {}; | |
| } | |
| #[macro_export] | |
| #[doc(hidden)] | |
| macro_rules! actually_hidden_macro { | |
| () => {}; | |
| } | |
| #[macro_export] | |
| #[doc(hidden)] | |
| macro_rules! actually_hidden_wild_macro { | |
| () => {}; | |
| } | |
| #[macro_export] | |
| #[doc(hidden)] | |
| macro_rules! actually_hidden_indirect_macro { | |
| () => {}; | |
| } | |
| } | |
| // Standard items (like structs) are provided as control cases to ensure | |
| // macro inlining behavior maintains parity. | |
| #[doc(hidden)] | |
| pub struct HiddenStruct; | |
| #[doc(hidden)] | |
| pub struct IndirectlyHiddenStruct; | |
| pub mod bar { | |
| mod hidden_explicit { | |
| #[doc(inline)] | |
| pub use crate::explicit_macro; | |
| } | |
| mod hidden_wild { | |
| #[doc(inline)] | |
| pub use crate::wild_macro; | |
| } | |
| mod actually_hidden { | |
| // BUG: as demonstrated by the `actually_hidden_struct` module, when both | |
| // `doc(hidden)` and `doc(inline)` are specified, `doc(hidden)` | |
| // should take priority. | |
| #[doc(hidden)] | |
| #[doc(inline)] | |
| pub use crate::actually_hidden_macro; | |
| } | |
| mod actually_hidden_indirect_inner { | |
| #[doc(inline)] | |
| pub use crate::actually_hidden_indirect_macro; | |
| } | |
| mod actually_hidden_indirect { | |
| // BUG: when there is a chain of imports, we should stop looking as soon as soon as we hit | |
| // something with `doc(hidden)`. | |
| #[doc(hidden)] | |
| pub use super::actually_hidden_indirect_inner::actually_hidden_indirect_macro; | |
| } | |
| mod actually_hidden_indirect_struct_inner { | |
| #[doc(inline)] | |
| pub use crate::IndirectlyHiddenStruct; | |
| } | |
| mod actually_hidden_indirect_struct { | |
| #[doc(hidden)] | |
| pub use super::actually_hidden_indirect_struct_inner::IndirectlyHiddenStruct; | |
| } | |
| mod actually_hidden_wild { | |
| #[doc(hidden)] | |
| #[doc(inline)] | |
| pub use crate::actually_hidden_wild_macro; | |
| } | |
| mod actually_hidden_struct { | |
| #[doc(inline)] | |
| #[doc(hidden)] | |
| pub use crate::HiddenStruct; | |
| } | |
| // First, we check that the explicitly named macro inherits the inline attribute | |
| // from `hidden_explicit` and is successfully rendered. | |
| //@ has 'foo/bar/macro.explicit_macro.html' | |
| //@ has 'foo/bar/index.html' '//a[@href="macro.explicit_macro.html"]' 'explicit_macro' | |
| pub use self::hidden_explicit::explicit_macro; | |
| // Next, we ensure that the glob-imported macro continues to render correctly | |
| // as a control case. | |
| //@ has 'foo/bar/macro.wild_macro.html' | |
| //@ has 'foo/bar/index.html' '//a[@href="macro.wild_macro.html"]' 'wild_macro' | |
| pub use self::hidden_wild::*; | |
| //@ !has 'foo/bar/macro.actually_hidden_macro.html' | |
| pub use self::actually_hidden::actually_hidden_macro; | |
| //@ !has 'foo/bar/macro.actually_hidden_wild_macro.html' | |
| pub use self::actually_hidden_wild::*; | |
| //@ !has 'foo/bar/struct.HiddenStruct.html' | |
| pub use self::actually_hidden_struct::HiddenStruct; | |
| //@ !has 'foo/bar/macro.actually_hidden_indirect_macro.html' | |
| pub use self::actually_hidden_indirect::actually_hidden_indirect_macro; | |
| //@ !has 'foo/bar/struct.IndirectlyHiddenStruct.html' | |
| pub use self::actually_hidden_indirect_struct::IndirectlyHiddenStruct; | |
| } |