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.rs23
1 files changed, 12 insertions, 11 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index 6f98ac071..baffbce6f 100644
--- a/crates/ra_hir/src/nameres.rs
+++ b/crates/ra_hir/src/nameres.rs
@@ -15,7 +15,7 @@
15//! so that the results of name resolution can be preserved unless the module 15//! so that the results of name resolution can be preserved unless the module
16//! structure itself is modified. 16//! structure itself is modified.
17pub(crate) mod lower; 17pub(crate) mod lower;
18mod crate_def_map; 18pub(crate) mod crate_def_map;
19 19
20use std::{time, sync::Arc}; 20use std::{time, sync::Arc};
21 21
@@ -29,8 +29,10 @@ use crate::{
29 Module, ModuleDef, 29 Module, ModuleDef,
30 Path, PathKind, PersistentHirDatabase, 30 Path, PathKind, PersistentHirDatabase,
31 Crate, Name, 31 Crate, Name,
32 module_tree::{ModuleId, ModuleTree}, 32 nameres::{
33 nameres::lower::{ImportId, LoweredModule, ImportData}, 33 crate_def_map::{CrateDefMap, ModuleId},
34 lower::{ImportId, LoweredModule, ImportData}
35 },
34}; 36};
35 37
36/// `ItemMap` is the result of module name resolution. It contains, for each 38/// `ItemMap` is the result of module name resolution. It contains, for each
@@ -160,7 +162,7 @@ struct Resolver<'a, DB> {
160 db: &'a DB, 162 db: &'a DB,
161 input: &'a FxHashMap<ModuleId, Arc<LoweredModule>>, 163 input: &'a FxHashMap<ModuleId, Arc<LoweredModule>>,
162 krate: Crate, 164 krate: Crate,
163 module_tree: Arc<ModuleTree>, 165 def_map: Arc<CrateDefMap>,
164 processed_imports: FxHashSet<(ModuleId, ImportId)>, 166 processed_imports: FxHashSet<(ModuleId, ImportId)>,
165 /// If module `a` has `use b::*`, then this contains the mapping b -> a (and the import) 167 /// If module `a` has `use b::*`, then this contains the mapping b -> a (and the import)
166 glob_imports: FxHashMap<ModuleId, Vec<(ModuleId, ImportId)>>, 168 glob_imports: FxHashMap<ModuleId, Vec<(ModuleId, ImportId)>>,
@@ -176,12 +178,11 @@ where
176 input: &'a FxHashMap<ModuleId, Arc<LoweredModule>>, 178 input: &'a FxHashMap<ModuleId, Arc<LoweredModule>>,
177 krate: Crate, 179 krate: Crate,
178 ) -> Resolver<'a, DB> { 180 ) -> Resolver<'a, DB> {
179 let module_tree = db.module_tree(krate);
180 Resolver { 181 Resolver {
181 db, 182 db,
182 input, 183 input,
183 krate, 184 krate,
184 module_tree, 185 def_map: db.crate_def_map(krate),
185 processed_imports: FxHashSet::default(), 186 processed_imports: FxHashSet::default(),
186 glob_imports: FxHashMap::default(), 187 glob_imports: FxHashMap::default(),
187 result: ItemMap { 188 result: ItemMap {
@@ -254,9 +255,9 @@ where
254 } 255 }
255 256
256 // Populate modules 257 // Populate modules
257 for (name, module_id) in module_id.children(&self.module_tree) { 258 for (name, module_id) in self.def_map[module_id].children.iter() {
258 let module = Module { module_id, krate: self.krate }; 259 let module = Module { module_id: *module_id, krate: self.krate };
259 self.add_module_item(&mut module_items, name, PerNs::types(module.into())); 260 self.add_module_item(&mut module_items, name.clone(), PerNs::types(module.into()));
260 } 261 }
261 262
262 self.result.per_module.insert(module_id, module_items); 263 self.result.per_module.insert(module_id, module_items);
@@ -479,8 +480,8 @@ enum ReachedFixedPoint {
479impl ItemMap { 480impl ItemMap {
480 pub(crate) fn item_map_query(db: &impl PersistentHirDatabase, krate: Crate) -> Arc<ItemMap> { 481 pub(crate) fn item_map_query(db: &impl PersistentHirDatabase, krate: Crate) -> Arc<ItemMap> {
481 let start = time::Instant::now(); 482 let start = time::Instant::now();
482 let module_tree = db.module_tree(krate); 483 let def_map = db.crate_def_map(krate);
483 let input = module_tree 484 let input = def_map
484 .modules() 485 .modules()
485 .map(|module_id| (module_id, db.lower_module(Module { krate, module_id }))) 486 .map(|module_id| (module_id, db.lower_module(Module { krate, module_id })))
486 .collect::<FxHashMap<_, _>>(); 487 .collect::<FxHashMap<_, _>>();