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.rs85
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
}