From 00ce770e348a4d00985b8872fc4874480115f621 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sat, 6 Jan 2018 17:23:33 +0530 Subject: [PATCH] Store a list of local macros on the resolver; use for resolving intra-doc macro links --- src/librustc_resolve/lib.rs | 2 ++ src/librustc_resolve/macros.rs | 3 ++- src/librustdoc/clean/mod.rs | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 6b7ad8394601..c55e23e917a1 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1320,6 +1320,7 @@ pub struct Resolver<'a> { crate_loader: &'a mut CrateLoader, macro_names: FxHashSet, global_macros: FxHashMap>, + pub all_macros: FxHashMap, lexical_macro_resolutions: Vec<(Ident, &'a Cell>)>, macro_map: FxHashMap>, macro_defs: FxHashMap, @@ -1596,6 +1597,7 @@ impl<'a> Resolver<'a> { crate_loader, macro_names: FxHashSet(), global_macros: FxHashMap(), + all_macros: FxHashMap(), lexical_macro_resolutions: Vec::new(), macro_map: FxHashMap(), macro_exports: Vec::new(), diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index e06d7dce4dbe..080ef3252a63 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -755,8 +755,9 @@ impl<'a> Resolver<'a> { *legacy_scope = LegacyScope::Binding(self.arenas.alloc_legacy_binding(LegacyBinding { parent: Cell::new(*legacy_scope), ident: ident, def_id: def_id, span: item.span, })); + let def = Def::Macro(def_id, MacroKind::Bang); + self.all_macros.insert(ident.name, def); if attr::contains_name(&item.attrs, "macro_export") { - let def = Def::Macro(def_id, MacroKind::Bang); self.macro_exports.push(Export { ident: ident.modern(), def: def, diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 74d1fd0d14e1..5031dddfdf38 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -940,6 +940,8 @@ impl Clean for [ast::Attribute] { .resolve_macro_to_def_inner(mark, &path, MacroKind::Bang, false); if let Ok(def) = res { def + } else if let Some(def) = resolver.all_macros.get(&path_str.into()) { + *def } else { continue; }