diff options
author | uHOOCCOOHu <[email protected]> | 2019-09-07 17:37:54 +0100 |
---|---|---|
committer | uHOOCCOOHu <[email protected]> | 2019-09-08 18:34:53 +0100 |
commit | 92c07803cc0ce1d2008cc912f006d1cd66ff3f4a (patch) | |
tree | 2ab6e7c3f12be1d82e9da854e4ed091b7fd15877 /crates/ra_hir/src/nameres.rs | |
parent | f7f7c2aff80f0870f0d71bf70075e3b5bf68994f (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.rs | 27 |
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)] |
139 | pub struct ModuleScope { | 139 | pub 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 | ||
145 | static BUILTIN_SCOPE: Lazy<FxHashMap<Name, Resolution>> = Lazy::new(|| { | 158 | static 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> { |