diff options
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs index eabaa5691..17602ee6b 100644 --- a/crates/ra_hir/src/nameres.rs +++ b/crates/ra_hir/src/nameres.rs | |||
@@ -57,7 +57,7 @@ use test_utils::tested_by; | |||
57 | use crate::{ | 57 | use crate::{ |
58 | ModuleDef, Name, Crate, Module, Problem, | 58 | ModuleDef, Name, Crate, Module, Problem, |
59 | PersistentHirDatabase, Path, PathKind, HirFileId, | 59 | PersistentHirDatabase, Path, PathKind, HirFileId, |
60 | ids::{SourceItemId, SourceFileItemId}, | 60 | ids::{SourceItemId, SourceFileItemId, MacroCallId}, |
61 | }; | 61 | }; |
62 | 62 | ||
63 | pub(crate) use self::raw::{RawItems, ImportId, ImportSourceMap}; | 63 | pub(crate) use self::raw::{RawItems, ImportId, ImportSourceMap}; |
@@ -76,7 +76,9 @@ pub struct CrateDefMap { | |||
76 | extern_prelude: FxHashMap<Name, ModuleDef>, | 76 | extern_prelude: FxHashMap<Name, ModuleDef>, |
77 | root: CrateModuleId, | 77 | root: CrateModuleId, |
78 | modules: Arena<CrateModuleId, ModuleData>, | 78 | modules: Arena<CrateModuleId, ModuleData>, |
79 | public_macros: FxHashMap<Name, mbe::MacroRules>, | 79 | macros: Arena<CrateMacroId, mbe::MacroRules>, |
80 | public_macros: FxHashMap<Name, CrateMacroId>, | ||
81 | macro_resolutions: FxHashMap<MacroCallId, (Crate, CrateMacroId)>, | ||
80 | problems: CrateDefMapProblems, | 82 | problems: CrateDefMapProblems, |
81 | } | 83 | } |
82 | 84 | ||
@@ -87,9 +89,21 @@ impl std::ops::Index<CrateModuleId> for CrateDefMap { | |||
87 | } | 89 | } |
88 | } | 90 | } |
89 | 91 | ||
92 | impl std::ops::Index<CrateMacroId> for CrateDefMap { | ||
93 | type Output = mbe::MacroRules; | ||
94 | fn index(&self, id: CrateMacroId) -> &mbe::MacroRules { | ||
95 | &self.macros[id] | ||
96 | } | ||
97 | } | ||
98 | |||
99 | /// An ID of a macro, **local** to a specific crate | ||
100 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | ||
101 | pub(crate) struct CrateMacroId(RawId); | ||
102 | impl_arena_id!(CrateMacroId); | ||
103 | |||
90 | /// An ID of a module, **local** to a specific crate | 104 | /// An ID of a module, **local** to a specific crate |
91 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 105 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] |
92 | struct CrateModuleId(RawId); | 106 | pub(crate) struct CrateModuleId(RawId); |
93 | impl_arena_id!(CrateModuleId); | 107 | impl_arena_id!(CrateModuleId); |
94 | 108 | ||
95 | #[derive(Default, Debug, PartialEq, Eq)] | 109 | #[derive(Default, Debug, PartialEq, Eq)] |
@@ -192,7 +206,9 @@ impl CrateDefMap { | |||
192 | prelude: None, | 206 | prelude: None, |
193 | root, | 207 | root, |
194 | modules, | 208 | modules, |
209 | macros: Arena::default(), | ||
195 | public_macros: FxHashMap::default(), | 210 | public_macros: FxHashMap::default(), |
211 | macro_resolutions: FxHashMap::default(), | ||
196 | problems: CrateDefMapProblems::default(), | 212 | problems: CrateDefMapProblems::default(), |
197 | } | 213 | } |
198 | }; | 214 | }; |
@@ -221,6 +237,13 @@ impl CrateDefMap { | |||
221 | &self.extern_prelude | 237 | &self.extern_prelude |
222 | } | 238 | } |
223 | 239 | ||
240 | pub(crate) fn resolve_macro( | ||
241 | &self, | ||
242 | macro_call_id: MacroCallId, | ||
243 | ) -> Option<(Crate, CrateMacroId)> { | ||
244 | self.macro_resolutions.get(¯o_call_id).map(|&it| it) | ||
245 | } | ||
246 | |||
224 | pub(crate) fn find_module_by_source( | 247 | pub(crate) fn find_module_by_source( |
225 | &self, | 248 | &self, |
226 | file_id: HirFileId, | 249 | file_id: HirFileId, |