aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r--crates/ra_hir/src/nameres.rs54
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;
59use ra_arena::{Arena, RawId, impl_arena_id}; 59use ra_arena::{Arena, RawId, impl_arena_id};
60use ra_db::{FileId, Edition}; 60use ra_db::{FileId, Edition};
61use test_utils::tested_by; 61use test_utils::tested_by;
62use ra_syntax::ast;
62 63
63use crate::{ 64use 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
71pub(crate) use self::raw::{RawItems, ImportId, ImportSourceMap}; 73pub(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
100impl 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)]
109pub(crate) struct CrateMacroId(RawId);
110impl_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)]
114pub(crate) struct CrateModuleId(RawId); 102pub(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(&macro_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
448mod diagnostics { 432mod 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}