aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres.rs
diff options
context:
space:
mode:
authoruHOOCCOOHu <[email protected]>2019-09-07 17:37:54 +0100
committeruHOOCCOOHu <[email protected]>2019-09-08 18:34:53 +0100
commit92c07803cc0ce1d2008cc912f006d1cd66ff3f4a (patch)
tree2ab6e7c3f12be1d82e9da854e4ed091b7fd15877 /crates/ra_hir/src/nameres.rs
parentf7f7c2aff80f0870f0d71bf70075e3b5bf68994f (diff)
Rename `textual_macro` -> `legacy_macro`
Add comments
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r--crates/ra_hir/src/nameres.rs27
1 files changed, 20 insertions, 7 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index befbb2a9b..74546e5e2 100644
--- a/crates/ra_hir/src/nameres.rs
+++ b/crates/ra_hir/src/nameres.rs
@@ -138,8 +138,21 @@ pub(crate) struct ModuleData {
138#[derive(Debug, Default, PartialEq, Eq, Clone)] 138#[derive(Debug, Default, PartialEq, Eq, Clone)]
139pub struct ModuleScope { 139pub struct ModuleScope {
140 items: FxHashMap<Name, Resolution>, 140 items: FxHashMap<Name, Resolution>,
141 /// Macros in current module scoped
142 ///
143 /// This scope works exactly the same way that item scoping does.
144 /// Macro invocation with quantified path will search in it.
145 /// See details below.
141 macros: FxHashMap<Name, MacroDef>, 146 macros: FxHashMap<Name, MacroDef>,
142 textual_macros: FxHashMap<Name, MacroDef>, 147 /// Macros visable in current module in legacy textual scope
148 ///
149 /// For macros invoked by an unquatified identifier like `bar!()`, `legacy_macros` will be searched in first.
150 /// If it yields no result, then it turns to module scoped `macros`.
151 /// It macros with name quatified with a path like `crate::foo::bar!()`, `legacy_macros` will be skipped,
152 /// and only normal scoped `macros` will be searched in.
153 ///
154 /// Note that this automatically inherit macros defined textually before the definition of module itself.
155 legacy_macros: FxHashMap<Name, MacroDef>,
143} 156}
144 157
145static BUILTIN_SCOPE: Lazy<FxHashMap<Name, Resolution>> = Lazy::new(|| { 158static BUILTIN_SCOPE: Lazy<FxHashMap<Name, Resolution>> = Lazy::new(|| {
@@ -173,8 +186,8 @@ impl ModuleScope {
173 _ => None, 186 _ => None,
174 } 187 }
175 } 188 }
176 fn get_textual_macro(&self, name: &Name) -> Option<MacroDef> { 189 fn get_legacy_macro(&self, name: &Name) -> Option<MacroDef> {
177 self.textual_macros.get(name).copied() 190 self.legacy_macros.get(name).copied()
178 } 191 }
179} 192}
180 193
@@ -489,13 +502,13 @@ impl CrateDefMap {
489 name: &Name, 502 name: &Name,
490 ) -> ItemOrMacro { 503 ) -> ItemOrMacro {
491 // Resolve in: 504 // Resolve in:
492 // - textual scoped macros 505 // - legacy scope
493 // - current module / scope 506 // - current module / scope
494 // - extern prelude 507 // - extern prelude
495 // - std prelude 508 // - std prelude
496 let from_textual_mcro = self[module] 509 let from_legacy_macro = self[module]
497 .scope 510 .scope
498 .get_textual_macro(name) 511 .get_legacy_macro(name)
499 .map_or_else(|| Either::A(PerNs::none()), Either::B); 512 .map_or_else(|| Either::A(PerNs::none()), Either::B);
500 let from_scope = 513 let from_scope =
501 self[module].scope.get_item_or_macro(name).unwrap_or_else(|| Either::A(PerNs::none())); 514 self[module].scope.get_item_or_macro(name).unwrap_or_else(|| Either::A(PerNs::none()));
@@ -503,7 +516,7 @@ impl CrateDefMap {
503 self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it)); 516 self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it));
504 let from_prelude = self.resolve_in_prelude(db, name); 517 let from_prelude = self.resolve_in_prelude(db, name);
505 518
506 or(from_textual_mcro, or(from_scope, or(Either::A(from_extern_prelude), from_prelude))) 519 or(from_legacy_macro, or(from_scope, or(Either::A(from_extern_prelude), from_prelude)))
507 } 520 }
508 521
509 fn resolve_name_in_extern_prelude(&self, name: &Name) -> PerNs<ModuleDef> { 522 fn resolve_name_in_extern_prelude(&self, name: &Name) -> PerNs<ModuleDef> {