Skip to content

Commit 898dfc6

Browse files
Correctly handle multiple re-exports of bang macros at the same level
1 parent c908d1e commit 898dfc6

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

src/librustdoc/visit_ast.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -305,16 +305,22 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
305305
return false;
306306
}
307307

308-
if !self.view_item_stack.insert(res_did) {
308+
let is_bang_macro = matches!(
309+
tcx.hir().get_by_def_id(res_did),
310+
Node::Item(&hir::Item { kind: hir::ItemKind::Macro(_, MacroKind::Bang), .. })
311+
);
312+
313+
if !self.view_item_stack.insert(res_did) && !is_bang_macro {
309314
return false;
310315
}
311316

312317
let ret = match tcx.hir().get_by_def_id(res_did) {
313318
// Bang macros are handled a bit on their because of how they are handled by the
314319
// compiler. If they have `#[doc(hidden)]` and the re-export doesn't have
315320
// `#[doc(inline)]`, then we don't inline it.
316-
Node::Item(&hir::Item { kind: hir::ItemKind::Macro(_, MacroKind::Bang), .. })
317-
if !please_inline
321+
Node::Item(_)
322+
if is_bang_macro
323+
&& !please_inline
318324
&& renamed.is_some()
319325
&& self.cx.tcx.is_doc_hidden(ori_res_did) =>
320326
{

tests/rustdoc/reexport-hidden-macro.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
// @has 'foo/index.html'
77
// @has - '//*[@id="main-content"]//a[@href="macro.Macro2.html"]' 'Macro2'
8+
// @has - '//*[@id="reexport.Macro"]/code' 'pub use crate::foo as Macro;'
89

910
// @has 'foo/macro.Macro2.html'
1011
// @has - '//*[@class="docblock"]' 'Displayed'
@@ -15,7 +16,6 @@ macro_rules! foo {
1516
() => {};
1617
}
1718

18-
// @has - '//*[@id="reexport.Macro"]/code' 'pub use crate::foo as Macro;'
1919
pub use crate::foo as Macro;
2020
/// Displayed
2121
#[doc(inline)]
+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// This test ensures that all re-exports of doc hidden elements are displayed.
2+
3+
#![crate_name = "foo"]
4+
5+
#[doc(hidden)]
6+
pub struct Bar;
7+
8+
#[macro_export]
9+
#[doc(hidden)]
10+
macro_rules! foo {
11+
() => {};
12+
}
13+
14+
// @has 'foo/index.html'
15+
// @has - '//*[@id="reexport.Macro"]/code' 'pub use crate::foo as Macro;'
16+
pub use crate::foo as Macro;
17+
// @has - '//*[@id="reexport.Macro2"]/code' 'pub use crate::foo as Macro2;'
18+
pub use crate::foo as Macro2;
19+
// @has - '//*[@id="reexport.Boo"]/code' 'pub use crate::Bar as Boo;'
20+
pub use crate::Bar as Boo;
21+
// @has - '//*[@id="reexport.Boo2"]/code' 'pub use crate::Bar as Boo2;'
22+
pub use crate::Bar as Boo2;
23+
24+
pub fn fofo() {}
25+
26+
// @has - '//*[@id="reexport.f1"]/code' 'pub use crate::fofo as f1;'
27+
pub use crate::fofo as f1;
28+
// @has - '//*[@id="reexport.f2"]/code' 'pub use crate::fofo as f2;'
29+
pub use crate::fofo as f2;
30+
31+
pub mod sub {
32+
// @has 'foo/sub/index.html'
33+
// @has - '//*[@id="reexport.Macro"]/code' 'pub use crate::foo as Macro;'
34+
pub use crate::foo as Macro;
35+
// @has - '//*[@id="reexport.Macro2"]/code' 'pub use crate::foo as Macro2;'
36+
pub use crate::foo as Macro2;
37+
38+
// @has - '//*[@id="reexport.f1"]/code' 'pub use crate::fofo as f1;'
39+
pub use crate::fofo as f1;
40+
// @has - '//*[@id="reexport.f2"]/code' 'pub use crate::fofo as f2;'
41+
pub use crate::fofo as f2;
42+
}

0 commit comments

Comments
 (0)