From 50b4eefcf5ce5e0a7808c6fc3f7effcea2e628c3 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Wed, 28 Nov 2018 17:10:21 +0100 Subject: [PATCH 1/5] rustdoc: Fix inlining reexported custom derives --- src/librustdoc/clean/inline.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 49cecd5b04bbc..464b6ea4fbe41 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -106,13 +106,23 @@ pub fn try_inline(cx: &DocContext, def: Def, name: ast::Name, visited: &mut FxHa clean::ConstantItem(build_const(cx, did)) } // FIXME: proc-macros don't propagate attributes or spans across crates, so they look empty + Def::Macro(did, MacroKind::Derive) | Def::Macro(did, MacroKind::Bang) => { let mac = build_macro(cx, did, name); - if let clean::MacroItem(..) = mac { - record_extern_fqn(cx, did, clean::TypeKind::Macro); - mac - } else { - return None; + debug!("try_inline: {:?}", mac); + + match build_macro(cx, did, name) { + clean::MacroItem(..) => { + record_extern_fqn(cx, did, clean::TypeKind::Macro); + mac + } + clean::ProcMacroItem(..) => { + record_extern_fqn(cx, did, clean::TypeKind::Derive); + mac + } + _ => { + return None; + } } } _ => return None, From 230f5d5676ffad99e64f73128dc27f629aa8e921 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Wed, 28 Nov 2018 17:11:06 +0100 Subject: [PATCH 2/5] rustdoc: Fix inlining reexporting bang-macros --- src/librustdoc/visit_ast.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 5d221d3006f3e..b44b1d9e0ba19 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -376,6 +376,10 @@ impl<'a, 'tcx, 'rcx, 'cstore> RustdocVisitor<'a, 'tcx, 'rcx, 'cstore> { }); true } + Node::MacroDef(def) if !glob => { + om.macros.push(self.visit_local_macro(def)); + true + } _ => false, }; self.view_item_stack.remove(&def_node_id); From 11fb023d4f8d9ab5c4063b767a26cab87c53653f Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 4 Dec 2018 10:23:13 +0100 Subject: [PATCH 3/5] Allow renaming macro --- src/librustdoc/visit_ast.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index b44b1d9e0ba19..31adb2e0369c9 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -100,7 +100,7 @@ impl<'a, 'tcx, 'rcx, 'cstore> RustdocVisitor<'a, 'tcx, 'rcx, 'cstore> { None); // attach the crate's exported macros to the top-level module: let macro_exports: Vec<_> = - krate.exported_macros.iter().map(|def| self.visit_local_macro(def)).collect(); + krate.exported_macros.iter().map(|def| self.visit_local_macro(def, None)).collect(); self.module.macros.extend(macro_exports); self.module.is_crate = true; @@ -377,7 +377,7 @@ impl<'a, 'tcx, 'rcx, 'cstore> RustdocVisitor<'a, 'tcx, 'rcx, 'cstore> { true } Node::MacroDef(def) if !glob => { - om.macros.push(self.visit_local_macro(def)); + om.macros.push(self.visit_local_macro(def, renamed)); true } _ => false, @@ -597,7 +597,11 @@ impl<'a, 'tcx, 'rcx, 'cstore> RustdocVisitor<'a, 'tcx, 'rcx, 'cstore> { } // convert each exported_macro into a doc item - fn visit_local_macro(&self, def: &hir::MacroDef) -> Macro { + fn visit_local_macro( + &self, + def: &hir::MacroDef, + renamed: Option + ) -> Macro { debug!("visit_local_macro: {}", def.name); let tts = def.body.trees().collect::>(); // Extract the spans of all matchers. They represent the "interface" of the macro. @@ -606,7 +610,7 @@ impl<'a, 'tcx, 'rcx, 'cstore> RustdocVisitor<'a, 'tcx, 'rcx, 'cstore> { Macro { def_id: self.cx.tcx.hir.local_def_id(def.id), attrs: def.attrs.clone(), - name: def.name, + name: renamed.unwrap_or(def.name), whence: def.span, matchers, stab: self.stability(def.id), From 9d4e17ae1adb4793071836699ae050c4af5d67f9 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 4 Dec 2018 10:23:30 +0100 Subject: [PATCH 4/5] Remove support for proc macro doc inlining --- src/librustdoc/clean/inline.rs | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 464b6ea4fbe41..49cecd5b04bbc 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -106,23 +106,13 @@ pub fn try_inline(cx: &DocContext, def: Def, name: ast::Name, visited: &mut FxHa clean::ConstantItem(build_const(cx, did)) } // FIXME: proc-macros don't propagate attributes or spans across crates, so they look empty - Def::Macro(did, MacroKind::Derive) | Def::Macro(did, MacroKind::Bang) => { let mac = build_macro(cx, did, name); - debug!("try_inline: {:?}", mac); - - match build_macro(cx, did, name) { - clean::MacroItem(..) => { - record_extern_fqn(cx, did, clean::TypeKind::Macro); - mac - } - clean::ProcMacroItem(..) => { - record_extern_fqn(cx, did, clean::TypeKind::Derive); - mac - } - _ => { - return None; - } + if let clean::MacroItem(..) = mac { + record_extern_fqn(cx, did, clean::TypeKind::Macro); + mac + } else { + return None; } } _ => return None, From 956b03f7db8b6b6b73bb4b2b6e0cbb1016e08f8a Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 4 Dec 2018 10:24:17 +0100 Subject: [PATCH 5/5] Add a test case for inlining the docs of a macro reexport --- .../rustdoc/inline_local/macro_by_example.rs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/test/rustdoc/inline_local/macro_by_example.rs diff --git a/src/test/rustdoc/inline_local/macro_by_example.rs b/src/test/rustdoc/inline_local/macro_by_example.rs new file mode 100644 index 0000000000000..93d55ec0798ac --- /dev/null +++ b/src/test/rustdoc/inline_local/macro_by_example.rs @@ -0,0 +1,28 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +/// docs for foo +#[deprecated(since = "1.2.3", note = "text")] +#[macro_export] +macro_rules! foo { + ($($tt:tt)*) => {} +} + +// @has macro_by_example/macros/index.html +pub mod macros { + // @!has - 'pub use foo as bar;' + // @has macro_by_example/macros/macro.bar.html + // @has - '//*[@class="docblock"]' 'docs for foo' + // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.2.3: text' + // @has - '//a/@href' 'macro_by_example.rs.html#15-17' + #[doc(inline)] + pub use foo as bar; +}