Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove doctree::Macro and distinguish between macro_rules! and pub macro #79455

Merged
merged 7 commits into from
Nov 29, 2020
45 changes: 30 additions & 15 deletions src/librustdoc/clean/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2313,22 +2313,37 @@ impl Clean<Item> for (&hir::ForeignItem<'_>, Option<Ident>) {
}
}

impl Clean<Item> for doctree::Macro {
impl Clean<Item> for (&hir::MacroDef<'_>, Option<Ident>) {
fn clean(&self, cx: &DocContext<'_>) -> Item {
Item::from_def_id_and_parts(
self.def_id,
Some(self.name.clean(cx)),
MacroItem(Macro {
source: format!(
"macro_rules! {} {{\n{}}}",
self.name,
self.matchers
.iter()
.map(|span| { format!(" {} => {{ ... }};\n", span.to_src(cx)) })
.collect::<String>()
),
imported_from: self.imported_from.clean(cx),
}),
let (item, renamed) = self;
let name = renamed.unwrap_or(item.ident).name;
let tts = item.ast.body.inner_tokens().trees().collect::<Vec<_>>();
// Extract the spans of all matchers. They represent the "interface" of the macro.
let matchers = tts.chunks(4).map(|arm| arm[0].span()).collect::<Vec<_>>();
let source = if item.ast.macro_rules {
format!(
"macro_rules! {} {{\n{}}}",
name,
matchers
.iter()
.map(|span| { format!(" {} => {{ ... }};\n", span.to_src(cx)) })
.collect::<String>(),
)
} else {
// This code currently assumes that there will only be one or zero matchers, as syntax
// for multiple is not currently defined.
CraftSpider marked this conversation as resolved.
Show resolved Hide resolved
format!(
"{}macro {}{} {{\n\t...\n}}",
item.vis.clean(cx).print_with_space(),
name,
matchers.iter().map(|span| span.to_src(cx)).collect::<String>(),
)
};

Item::from_hir_id_and_parts(
item.hir_id,
Some(name),
MacroItem(Macro { source, imported_from: None }),
cx,
)
}
Expand Down
11 changes: 1 addition & 10 deletions src/librustdoc/doctree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ crate struct Module<'hir> {
// (item, renamed)
crate items: Vec<(&'hir hir::Item<'hir>, Option<Ident>)>,
crate foreigns: Vec<(&'hir hir::ForeignItem<'hir>, Option<Ident>)>,
crate macros: Vec<Macro>,
crate macros: Vec<(&'hir hir::MacroDef<'hir>, Option<Ident>)>,
crate is_crate: bool,
}

Expand Down Expand Up @@ -56,15 +56,6 @@ crate struct Variant<'hir> {
crate def: &'hir hir::VariantData<'hir>,
}

// For Macro we store the DefId instead of the NodeId, since we also create
// these imported macro_rules (which only have a DUMMY_NODE_ID).
crate struct Macro {
crate name: Symbol,
crate def_id: hir::def_id::DefId,
crate matchers: Vec<Span>,
crate imported_from: Option<Symbol>,
}

#[derive(Debug)]
crate struct Import<'hir> {
crate name: Symbol,
Expand Down
21 changes: 2 additions & 19 deletions src/librustdoc/visit_ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
None,
);
// Attach the crate's exported macros to the top-level module:
module
.macros
.extend(krate.exported_macros.iter().map(|def| self.visit_local_macro(def, None)));
module.macros.extend(krate.exported_macros.iter().map(|def| (def, None)));
module.is_crate = true;

self.cx.renderinfo.get_mut().exact_paths = self.exact_paths;
Expand Down Expand Up @@ -216,7 +214,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
true
}
Node::MacroDef(def) if !glob => {
om.macros.push(self.visit_local_macro(def, renamed.map(|i| i.name)));
om.macros.push((def, renamed));
true
}
_ => false,
Expand Down Expand Up @@ -339,19 +337,4 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
om.foreigns.push((item, renamed));
}
}

// Convert each `exported_macro` into a doc item.
fn visit_local_macro(&self, def: &'tcx hir::MacroDef<'_>, renamed: Option<Symbol>) -> Macro {
debug!("visit_local_macro: {}", def.ident);
let tts = def.ast.body.inner_tokens().trees().collect::<Vec<_>>();
// Extract the spans of all matchers. They represent the "interface" of the macro.
let matchers = tts.chunks(4).map(|arm| arm[0].span()).collect();

Macro {
def_id: self.cx.tcx.hir().local_def_id(def.hir_id).to_def_id(),
name: renamed.unwrap_or(def.ident.name),
matchers,
imported_from: None,
}
}
}
15 changes: 15 additions & 0 deletions src/test/rustdoc/decl_macro.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#![feature(decl_macro)]

// @has decl_macro/macro.my_macro.html //pre 'pub macro my_macro() {'
// @has - //pre '...'
// @has - //pre '}'
pub macro my_macro() {

}

// @has decl_macro/macro.my_macro_2.html //pre 'pub macro my_macro_2($($tok:tt)*) {'
// @has - //pre '...'
// @has - //pre '}'
pub macro my_macro_2($($tok:tt)*) {

}
13 changes: 13 additions & 0 deletions src/test/rustdoc/decl_macro_priv.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// compile-flags: --document-private-items

#![feature(decl_macro)]

// @has decl_macro_priv/macro.crate_macro.html //pre 'pub(crate) macro crate_macro() {'
// @has - //pre '...'
// @has - //pre '}'
pub(crate) macro crate_macro() {}

// @has decl_macro_priv/macro.priv_macro.html //pre 'macro priv_macro() {'
CraftSpider marked this conversation as resolved.
Show resolved Hide resolved
// @has - //pre '...'
// @has - //pre '}'
macro priv_macro() {}