diff options
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 54 |
1 files changed, 18 insertions, 36 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs index 56ed872d5..67b9d6986 100644 --- a/crates/ra_hir/src/nameres.rs +++ b/crates/ra_hir/src/nameres.rs | |||
@@ -59,13 +59,15 @@ use rustc_hash::FxHashMap; | |||
59 | use ra_arena::{Arena, RawId, impl_arena_id}; | 59 | use ra_arena::{Arena, RawId, impl_arena_id}; |
60 | use ra_db::{FileId, Edition}; | 60 | use ra_db::{FileId, Edition}; |
61 | use test_utils::tested_by; | 61 | use test_utils::tested_by; |
62 | use ra_syntax::ast; | ||
62 | 63 | ||
63 | use crate::{ | 64 | use crate::{ |
64 | ModuleDef, Name, Crate, Module, | 65 | ModuleDef, Name, Crate, Module, |
65 | DefDatabase, Path, PathKind, HirFileId, | 66 | DefDatabase, Path, PathKind, HirFileId, Trait, |
66 | ids::{SourceItemId, SourceFileItemId, MacroCallId}, | 67 | ids::MacroDefId, |
67 | diagnostics::DiagnosticSink, | 68 | diagnostics::DiagnosticSink, |
68 | nameres::diagnostics::DefDiagnostic, | 69 | nameres::diagnostics::DefDiagnostic, |
70 | AstId, | ||
69 | }; | 71 | }; |
70 | 72 | ||
71 | pub(crate) use self::raw::{RawItems, ImportId, ImportSourceMap}; | 73 | pub(crate) use self::raw::{RawItems, ImportId, ImportSourceMap}; |
@@ -84,9 +86,7 @@ pub struct CrateDefMap { | |||
84 | extern_prelude: FxHashMap<Name, ModuleDef>, | 86 | extern_prelude: FxHashMap<Name, ModuleDef>, |
85 | root: CrateModuleId, | 87 | root: CrateModuleId, |
86 | modules: Arena<CrateModuleId, ModuleData>, | 88 | modules: Arena<CrateModuleId, ModuleData>, |
87 | macros: Arena<CrateMacroId, mbe::MacroRules>, | 89 | public_macros: FxHashMap<Name, MacroDefId>, |
88 | public_macros: FxHashMap<Name, CrateMacroId>, | ||
89 | macro_resolutions: FxHashMap<MacroCallId, (Crate, CrateMacroId)>, | ||
90 | diagnostics: Vec<DefDiagnostic>, | 90 | diagnostics: Vec<DefDiagnostic>, |
91 | } | 91 | } |
92 | 92 | ||
@@ -97,18 +97,6 @@ impl std::ops::Index<CrateModuleId> for CrateDefMap { | |||
97 | } | 97 | } |
98 | } | 98 | } |
99 | 99 | ||
100 | impl std::ops::Index<CrateMacroId> for CrateDefMap { | ||
101 | type Output = mbe::MacroRules; | ||
102 | fn index(&self, id: CrateMacroId) -> &mbe::MacroRules { | ||
103 | &self.macros[id] | ||
104 | } | ||
105 | } | ||
106 | |||
107 | /// An ID of a macro, **local** to a specific crate | ||
108 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | ||
109 | pub(crate) struct CrateMacroId(RawId); | ||
110 | impl_arena_id!(CrateMacroId); | ||
111 | |||
112 | /// An ID of a module, **local** to a specific crate | 100 | /// An ID of a module, **local** to a specific crate |
113 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 101 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] |
114 | pub(crate) struct CrateModuleId(RawId); | 102 | pub(crate) struct CrateModuleId(RawId); |
@@ -120,7 +108,7 @@ pub(crate) struct ModuleData { | |||
120 | pub(crate) children: FxHashMap<Name, CrateModuleId>, | 108 | pub(crate) children: FxHashMap<Name, CrateModuleId>, |
121 | pub(crate) scope: ModuleScope, | 109 | pub(crate) scope: ModuleScope, |
122 | /// None for root | 110 | /// None for root |
123 | pub(crate) declaration: Option<SourceItemId>, | 111 | pub(crate) declaration: Option<AstId<ast::Module>>, |
124 | /// None for inline modules. | 112 | /// None for inline modules. |
125 | /// | 113 | /// |
126 | /// Note that non-inline modules, by definition, live inside non-macro file. | 114 | /// Note that non-inline modules, by definition, live inside non-macro file. |
@@ -139,6 +127,12 @@ impl ModuleScope { | |||
139 | pub fn get(&self, name: &Name) -> Option<&Resolution> { | 127 | pub fn get(&self, name: &Name) -> Option<&Resolution> { |
140 | self.items.get(name) | 128 | self.items.get(name) |
141 | } | 129 | } |
130 | pub fn traits<'a>(&'a self) -> impl Iterator<Item = Trait> + 'a { | ||
131 | self.items.values().filter_map(|r| match r.def.take_types() { | ||
132 | Some(ModuleDef::Trait(t)) => Some(t), | ||
133 | _ => None, | ||
134 | }) | ||
135 | } | ||
142 | } | 136 | } |
143 | 137 | ||
144 | #[derive(Debug, Clone, PartialEq, Eq, Default)] | 138 | #[derive(Debug, Clone, PartialEq, Eq, Default)] |
@@ -196,9 +190,7 @@ impl CrateDefMap { | |||
196 | prelude: None, | 190 | prelude: None, |
197 | root, | 191 | root, |
198 | modules, | 192 | modules, |
199 | macros: Arena::default(), | ||
200 | public_macros: FxHashMap::default(), | 193 | public_macros: FxHashMap::default(), |
201 | macro_resolutions: FxHashMap::default(), | ||
202 | diagnostics: Vec::new(), | 194 | diagnostics: Vec::new(), |
203 | } | 195 | } |
204 | }; | 196 | }; |
@@ -232,19 +224,11 @@ impl CrateDefMap { | |||
232 | self.diagnostics.iter().for_each(|it| it.add_to(db, module, sink)) | 224 | self.diagnostics.iter().for_each(|it| it.add_to(db, module, sink)) |
233 | } | 225 | } |
234 | 226 | ||
235 | pub(crate) fn resolve_macro( | ||
236 | &self, | ||
237 | macro_call_id: MacroCallId, | ||
238 | ) -> Option<(Crate, CrateMacroId)> { | ||
239 | self.macro_resolutions.get(¯o_call_id).map(|&it| it) | ||
240 | } | ||
241 | |||
242 | pub(crate) fn find_module_by_source( | 227 | pub(crate) fn find_module_by_source( |
243 | &self, | 228 | &self, |
244 | file_id: HirFileId, | 229 | file_id: HirFileId, |
245 | decl_id: Option<SourceFileItemId>, | 230 | decl_id: Option<AstId<ast::Module>>, |
246 | ) -> Option<CrateModuleId> { | 231 | ) -> Option<CrateModuleId> { |
247 | let decl_id = decl_id.map(|it| it.with_file_id(file_id)); | ||
248 | let (module_id, _module_data) = self.modules.iter().find(|(_module_id, module_data)| { | 232 | let (module_id, _module_data) = self.modules.iter().find(|(_module_id, module_data)| { |
249 | if decl_id.is_some() { | 233 | if decl_id.is_some() { |
250 | module_data.declaration == decl_id | 234 | module_data.declaration == decl_id |
@@ -447,10 +431,10 @@ impl CrateDefMap { | |||
447 | 431 | ||
448 | mod diagnostics { | 432 | mod diagnostics { |
449 | use relative_path::RelativePathBuf; | 433 | use relative_path::RelativePathBuf; |
450 | use ra_syntax::{AstPtr, AstNode, ast}; | 434 | use ra_syntax::{AstPtr, ast}; |
451 | 435 | ||
452 | use crate::{ | 436 | use crate::{ |
453 | SourceItemId, DefDatabase, | 437 | AstId, DefDatabase, |
454 | nameres::CrateModuleId, | 438 | nameres::CrateModuleId, |
455 | diagnostics::{DiagnosticSink, UnresolvedModule}, | 439 | diagnostics::{DiagnosticSink, UnresolvedModule}, |
456 | }; | 440 | }; |
@@ -459,7 +443,7 @@ mod diagnostics { | |||
459 | pub(super) enum DefDiagnostic { | 443 | pub(super) enum DefDiagnostic { |
460 | UnresolvedModule { | 444 | UnresolvedModule { |
461 | module: CrateModuleId, | 445 | module: CrateModuleId, |
462 | declaration: SourceItemId, | 446 | declaration: AstId<ast::Module>, |
463 | candidate: RelativePathBuf, | 447 | candidate: RelativePathBuf, |
464 | }, | 448 | }, |
465 | } | 449 | } |
@@ -476,10 +460,9 @@ mod diagnostics { | |||
476 | if *module != target_module { | 460 | if *module != target_module { |
477 | return; | 461 | return; |
478 | } | 462 | } |
479 | let syntax = db.file_item(*declaration); | 463 | let decl = declaration.to_node(db); |
480 | let decl = ast::Module::cast(&syntax).unwrap(); | ||
481 | sink.push(UnresolvedModule { | 464 | sink.push(UnresolvedModule { |
482 | file: declaration.file_id, | 465 | file: declaration.file_id(), |
483 | decl: AstPtr::new(&decl), | 466 | decl: AstPtr::new(&decl), |
484 | candidate: candidate.clone(), | 467 | candidate: candidate.clone(), |
485 | }) | 468 | }) |
@@ -487,5 +470,4 @@ mod diagnostics { | |||
487 | } | 470 | } |
488 | } | 471 | } |
489 | } | 472 | } |
490 | |||
491 | } | 473 | } |