rustdoc: Inherit inline attributes for declarative macros#154902
rustdoc: Inherit inline attributes for declarative macros#154902shivendra02467 wants to merge 1 commit intorust-lang:mainfrom
Conversation
|
rustbot has assigned @lolbinarycat. Use Why was this reviewer chosen?The reviewer was selected based on:
|
This comment has been minimized.
This comment has been minimized.
When explicitly re-exporting a declarative macro by name, rustdoc previously bypassed intermediate re-exports and dropped `#[doc(inline)]` attributes, causing the macro to be incorrectly stripped if the original definition was `#[doc(hidden)]`. This updates `generate_item_with_correct_attrs` to walk the `reexport_chain` specifically for declarative macros, allowing them to inherit inline attributes exactly as glob imports do, while preserving strict visibility rules for standard items.
9ada003 to
e571df1
Compare
|
thanks for the contribution!
EDIT: nvm there is a regression test, not sure how i missed that. |
No worries at all! Thanks for taking a look. Take your time with the review, and just let me know if you need any adjustments to the test or the logic once you get a chance to dig into it. |
|
The logic is a bit naive, Specifically, as we walk backwards through the import chain1, if we hit a The code already had a decent bit of duplication going on, and the extra logic would only add to that, so please factor out the check (or at least a decent portion of it) into a utility function or method, perhaps named something like Modified test with extra details in comments// 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 {
() => {};
}
}
// We would like to have parity between macro inlining and inlining other items,
// so I'm providing a struct for reference.
#[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)`.
// IMO this is the more important of the two bugs.
#[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;
}Footnotes
|
|
@rustbot author |
|
Reminder, once the PR becomes ready for a review, use |
When explicitly re-exporting a declarative macro by name, rustdoc previously bypassed intermediate re-exports and dropped
#[doc(inline)]attributes, causing the macro to be incorrectly stripped if the original definition was#[doc(hidden)].This updates
generate_item_with_correct_attrsto walk thereexport_chainspecifically for declarative macros, allowing them to inherit inline attributes exactly as glob imports do, while preserving strict visibility rules for standard items.Fixes #154694