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 | 85 |
1 files changed, 49 insertions, 36 deletions
diff --git a/crates/hir-def/src/resolver.rs b/crates/hir-def/src/resolver.rs index 698292c2fb..ccea043739 100644 --- a/crates/hir-def/src/resolver.rs +++ b/crates/hir-def/src/resolver.rs @@ -186,15 +186,15 @@ impl<'db> Resolver<'db> { Path::Normal(it) => &it.mod_path, Path::LangItem(l, seg) => { let type_ns = match *l { - LangItemTarget::Union(it) => TypeNs::AdtId(it.into()), - LangItemTarget::TypeAlias(it) => TypeNs::TypeAliasId(it), - LangItemTarget::Struct(it) => TypeNs::AdtId(it.into()), - LangItemTarget::EnumVariant(it) => TypeNs::EnumVariantId(it), + LangItemTarget::UnionId(it) => TypeNs::AdtId(it.into()), + LangItemTarget::TypeAliasId(it) => TypeNs::TypeAliasId(it), + LangItemTarget::StructId(it) => TypeNs::AdtId(it.into()), + LangItemTarget::EnumVariantId(it) => TypeNs::EnumVariantId(it), LangItemTarget::EnumId(it) => TypeNs::AdtId(it.into()), - LangItemTarget::Trait(it) => TypeNs::TraitId(it), - LangItemTarget::Function(_) - | LangItemTarget::ImplDef(_) - | LangItemTarget::Static(_) => return None, + LangItemTarget::TraitId(it) => TypeNs::TraitId(it), + LangItemTarget::FunctionId(_) + | LangItemTarget::ImplId(_) + | LangItemTarget::StaticId(_) => return None, }; return Some(( type_ns, @@ -334,14 +334,14 @@ impl<'db> Resolver<'db> { return Some(( ResolveValueResult::ValueNs( match *l { - LangItemTarget::Function(it) => ValueNs::FunctionId(it), - LangItemTarget::Static(it) => ValueNs::StaticId(it), - LangItemTarget::Struct(it) => ValueNs::StructId(it), - LangItemTarget::EnumVariant(it) => ValueNs::EnumVariantId(it), - LangItemTarget::Union(_) - | LangItemTarget::ImplDef(_) - | LangItemTarget::TypeAlias(_) - | LangItemTarget::Trait(_) + LangItemTarget::FunctionId(it) => ValueNs::FunctionId(it), + LangItemTarget::StaticId(it) => ValueNs::StaticId(it), + LangItemTarget::StructId(it) => ValueNs::StructId(it), + LangItemTarget::EnumVariantId(it) => ValueNs::EnumVariantId(it), + LangItemTarget::UnionId(_) + | LangItemTarget::ImplId(_) + | LangItemTarget::TypeAliasId(_) + | LangItemTarget::TraitId(_) | LangItemTarget::EnumId(_) => return None, }, None, @@ -351,15 +351,15 @@ impl<'db> Resolver<'db> { } Path::LangItem(l, Some(_)) => { let type_ns = match *l { - LangItemTarget::Union(it) => TypeNs::AdtId(it.into()), - LangItemTarget::TypeAlias(it) => TypeNs::TypeAliasId(it), - LangItemTarget::Struct(it) => TypeNs::AdtId(it.into()), - LangItemTarget::EnumVariant(it) => TypeNs::EnumVariantId(it), + LangItemTarget::UnionId(it) => TypeNs::AdtId(it.into()), + LangItemTarget::TypeAliasId(it) => TypeNs::TypeAliasId(it), + LangItemTarget::StructId(it) => TypeNs::AdtId(it.into()), + LangItemTarget::EnumVariantId(it) => TypeNs::EnumVariantId(it), LangItemTarget::EnumId(it) => TypeNs::AdtId(it.into()), - LangItemTarget::Trait(it) => TypeNs::TraitId(it), - LangItemTarget::Function(_) - | LangItemTarget::ImplDef(_) - | LangItemTarget::Static(_) => return None, + LangItemTarget::TraitId(it) => TypeNs::TraitId(it), + LangItemTarget::FunctionId(_) + | LangItemTarget::ImplId(_) + | LangItemTarget::StaticId(_) => return None, }; // Remaining segments start from 0 because lang paths have no segments other than the remaining. return Some(( @@ -708,6 +708,20 @@ impl<'db> Resolver<'db> { self.item_scope_().0 } + #[inline] + pub fn top_level_def_map(&self) -> &'db DefMap { + self.module_scope.def_map + } + + #[inline] + pub fn is_visible(&self, db: &dyn DefDatabase, visibility: Visibility) -> bool { + visibility.is_visible_from_def_map( + db, + self.module_scope.def_map, + self.module_scope.module_id, + ) + } + pub fn generic_def(&self) -> Option<GenericDefId> { self.scopes().find_map(|scope| match scope { Scope::GenericParams { def, .. } => Some(*def), @@ -1075,7 +1089,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 +1124,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 +1286,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 +1296,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 +1306,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 } |