Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/resolver.rs')
| -rw-r--r-- | crates/hir-def/src/resolver.rs | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/crates/hir-def/src/resolver.rs b/crates/hir-def/src/resolver.rs index 698292c2fb..abcf0a397c 100644 --- a/crates/hir-def/src/resolver.rs +++ b/crates/hir-def/src/resolver.rs @@ -1075,7 +1075,9 @@ fn resolver_for_scope_<'db>( if let Some(block) = scopes.block(scope) { let def_map = block_def_map(db, block); let local_def_map = block.lookup(db).module.only_local_def_map(db); - r = r.push_block_scope(def_map, local_def_map); + // Using `DefMap::ROOT` is okay here since inside modules other than the root, + // there can't directly be expressions. + r = r.push_block_scope(def_map, local_def_map, DefMap::ROOT); // FIXME: This adds as many module scopes as there are blocks, but resolving in each // already traverses all parents, so this is O(n²). I think we could only store the // innermost module scope instead? @@ -1108,12 +1110,9 @@ impl<'db> Resolver<'db> { self, def_map: &'db DefMap, local_def_map: &'db LocalDefMap, + module_id: LocalModuleId, ) -> Resolver<'db> { - self.push_scope(Scope::BlockScope(ModuleItemMap { - def_map, - local_def_map, - module_id: DefMap::ROOT, - })) + self.push_scope(Scope::BlockScope(ModuleItemMap { def_map, local_def_map, module_id })) } fn push_expr_scope( @@ -1273,7 +1272,7 @@ impl HasResolver for ModuleId { let (mut def_map, local_def_map) = self.local_def_map(db); let mut module_id = self.local_id; - if !self.is_block_module() { + if !self.is_within_block() { return Resolver { scopes: vec![], module_scope: ModuleItemMap { def_map, local_def_map, module_id }, @@ -1283,9 +1282,9 @@ impl HasResolver for ModuleId { let mut modules: SmallVec<[_; 1]> = smallvec![]; while let Some(parent) = def_map.parent() { let block_def_map = mem::replace(&mut def_map, parent.def_map(db)); - modules.push(block_def_map); - if !parent.is_block_module() { - module_id = parent.local_id; + let block_module_id = mem::replace(&mut module_id, parent.local_id); + modules.push((block_def_map, block_module_id)); + if !parent.is_within_block() { break; } } @@ -1293,8 +1292,8 @@ impl HasResolver for ModuleId { scopes: Vec::with_capacity(modules.len()), module_scope: ModuleItemMap { def_map, local_def_map, module_id }, }; - for def_map in modules.into_iter().rev() { - resolver = resolver.push_block_scope(def_map, local_def_map); + for (def_map, module_id) in modules.into_iter().rev() { + resolver = resolver.push_block_scope(def_map, local_def_map, module_id); } resolver } |