diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 03fda94a6dfc..f417eb6740cd 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2313,21 +2313,28 @@ impl Clean for (&hir::ForeignItem<'_>, Option) { } } -impl Clean for doctree::Macro { +impl Clean for (&hir::MacroDef<'_>, Option) { fn clean(&self, cx: &DocContext<'_>) -> Item { + let (item, renamed) = self; + let name = renamed.unwrap_or(item.ident).name; + let tts = item.ast.body.inner_tokens().trees().collect::>(); + // Extract the spans of all matchers. They represent the "interface" of the macro. + let matchers = tts.chunks(4).map(|arm| arm[0].span()).collect::>(); + Item::from_def_id_and_parts( - self.def_id, - Some(self.name.clean(cx)), + cx.tcx.hir().local_def_id(item.hir_id).to_def_id(), + Some(name.clean(cx)), MacroItem(Macro { + // FIXME(#76761): Make this respect `macro_rules!` vs `pub macro` source: format!( "macro_rules! {} {{\n{}}}", - self.name, - self.matchers + name, + matchers .iter() .map(|span| { format!(" {} => {{ ... }};\n", span.to_src(cx)) }) - .collect::() + .collect::(), ), - imported_from: self.imported_from.clean(cx), + imported_from: None, }), cx, ) diff --git a/src/librustdoc/doctree.rs b/src/librustdoc/doctree.rs index 20f747e20141..3961870a1bfa 100644 --- a/src/librustdoc/doctree.rs +++ b/src/librustdoc/doctree.rs @@ -18,7 +18,7 @@ crate struct Module<'hir> { // (item, renamed) crate items: Vec<(&'hir hir::Item<'hir>, Option)>, crate foreigns: Vec<(&'hir hir::ForeignItem<'hir>, Option)>, - crate macros: Vec, + crate macros: Vec<(&'hir hir::MacroDef<'hir>, Option)>, crate is_crate: bool, } @@ -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, - crate imported_from: Option, -} - #[derive(Debug)] crate struct Import<'hir> { crate name: Symbol, diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 02152edbbc21..4028293076df 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -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; @@ -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, @@ -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) -> Macro { - debug!("visit_local_macro: {}", def.ident); - let tts = def.ast.body.inner_tokens().trees().collect::>(); - // 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, - } - } }