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.rs83
1 files changed, 57 insertions, 26 deletions
diff --git a/crates/hir-def/src/resolver.rs b/crates/hir-def/src/resolver.rs
index 63ff384de0..5b11f5ff8b 100644
--- a/crates/hir-def/src/resolver.rs
+++ b/crates/hir-def/src/resolver.rs
@@ -33,7 +33,7 @@ use crate::{
item_scope::{BUILTIN_SCOPE, BuiltinShadowMode, ImportOrExternCrate, ItemScope},
lang_item::LangItemTarget,
nameres::{DefMap, LocalDefMap, MacroSubNs, ResolvePathResultPrefixInfo, block_def_map},
- per_ns::PerNs,
+ per_ns::{MacrosItem, PerNs},
signatures::ImplSignature,
src::HasSource,
type_ref::LifetimeRef,
@@ -174,7 +174,9 @@ impl<'db> Resolver<'db> {
path: &Path,
) -> Option<(TypeNs, Option<usize>, Option<ImportOrExternCrate>)> {
self.resolve_path_in_type_ns_with_prefix_info(db, path).map(
- |(resolution, remaining_segments, import, _)| (resolution, remaining_segments, import),
+ |(resolution, remaining_segments, import, _, _)| {
+ (resolution, remaining_segments, import)
+ },
)
}
@@ -182,8 +184,13 @@ impl<'db> Resolver<'db> {
&self,
db: &dyn SourceDatabase,
path: &Path,
- ) -> Option<(TypeNs, Option<usize>, Option<ImportOrExternCrate>, ResolvePathResultPrefixInfo)>
- {
+ ) -> Option<(
+ TypeNs,
+ Option<usize>,
+ Option<ImportOrExternCrate>,
+ ResolvePathResultPrefixInfo,
+ Visibility,
+ )> {
let path = match path {
Path::BarePath(mod_path) => mod_path,
Path::Normal(it) => &it.mod_path,
@@ -206,6 +213,7 @@ impl<'db> Resolver<'db> {
seg.as_ref().map(|_| 1),
None,
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
};
@@ -230,6 +238,7 @@ impl<'db> Resolver<'db> {
remaining_idx(),
None,
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
} else if let &GenericDefId::AdtId(adt) = def
@@ -240,6 +249,7 @@ impl<'db> Resolver<'db> {
remaining_idx(),
None,
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
if let Some(id) = params.find_type_by_name(first_name, *def) {
@@ -248,6 +258,7 @@ impl<'db> Resolver<'db> {
remaining_idx(),
None,
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
}
@@ -264,6 +275,7 @@ impl<'db> Resolver<'db> {
remaining_idx(),
None,
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
)
} else {
res
@@ -323,7 +335,7 @@ impl<'db> Resolver<'db> {
path: &Path,
hygiene_id: HygieneId,
) -> Option<ResolveValueResult> {
- self.resolve_path_in_value_ns_with_prefix_info(db, path, hygiene_id).map(|(it, _)| it)
+ self.resolve_path_in_value_ns_with_prefix_info(db, path, hygiene_id).map(|(it, _, _)| it)
}
fn skip_to_mod<'this, T>(
@@ -343,7 +355,7 @@ impl<'db> Resolver<'db> {
db: &dyn SourceDatabase,
path: &Path,
mut hygiene_id: HygieneId,
- ) -> Option<(ResolveValueResult, ResolvePathResultPrefixInfo)> {
+ ) -> Option<(ResolveValueResult, ResolvePathResultPrefixInfo, Visibility)> {
let path = match path {
Path::BarePath(mod_path) => mod_path,
Path::Normal(it) => &it.mod_path,
@@ -363,6 +375,7 @@ impl<'db> Resolver<'db> {
| LangItemTarget::MacroId(_) => return None,
}),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
Path::LangItem(l, Some(_)) => {
@@ -383,6 +396,7 @@ impl<'db> Resolver<'db> {
return Some((
ResolveValueResult::Partial(type_ns, 0),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
};
@@ -408,6 +422,7 @@ impl<'db> Resolver<'db> {
return Some((
ResolveValueResult::ValueNs(ValueNs::LocalBinding(e.binding())),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
}
@@ -421,6 +436,7 @@ impl<'db> Resolver<'db> {
return Some((
ResolveValueResult::ValueNs(ValueNs::ImplSelf(impl_)),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
if let Some(id) = params.find_const_by_name(first_name, *def) {
@@ -428,6 +444,7 @@ impl<'db> Resolver<'db> {
return Some((
ResolveValueResult::ValueNs(val),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
}
@@ -448,6 +465,7 @@ impl<'db> Resolver<'db> {
return Some((
ResolveValueResult::Partial(TypeNs::SelfType(impl_), 1),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
} else if let &GenericDefId::AdtId(adt) = def
@@ -457,6 +475,7 @@ impl<'db> Resolver<'db> {
return Some((
ResolveValueResult::Partial(ty, 1),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
if let Some(id) = params.find_type_by_name(first_name, *def) {
@@ -464,6 +483,7 @@ impl<'db> Resolver<'db> {
return Some((
ResolveValueResult::Partial(ty, 1),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
}
@@ -490,6 +510,7 @@ impl<'db> Resolver<'db> {
return Some((
ResolveValueResult::Partial(TypeNs::BuiltinType(builtin), 1),
ResolvePathResultPrefixInfo::default(),
+ Visibility::Public,
));
}
@@ -513,7 +534,7 @@ impl<'db> Resolver<'db> {
db: &dyn SourceDatabase,
path: &ModPath,
expected_macro_kind: Option<MacroSubNs>,
- ) -> Option<(MacroId, Option<ImportOrExternCrate>)> {
+ ) -> Option<MacrosItem> {
let (item_map, item_local_map, module) = self.item_scope_();
item_map
.resolve_path(
@@ -525,7 +546,7 @@ impl<'db> Resolver<'db> {
expected_macro_kind,
)
.0
- .take_macros_import()
+ .take_macros_full()
}
pub fn resolve_path_as_macro_def(
@@ -534,7 +555,7 @@ impl<'db> Resolver<'db> {
path: &ModPath,
expected_macro_kind: Option<MacroSubNs>,
) -> Option<MacroDefId> {
- self.resolve_path_as_macro(db, path, expected_macro_kind).map(|(it, _)| it.definition(db))
+ self.resolve_path_as_macro(db, path, expected_macro_kind).map(|it| it.def.definition(db))
}
pub fn resolve_lifetime(&self, lifetime: &LifetimeRef) -> Option<LifetimeNs> {
@@ -1166,7 +1187,7 @@ impl<'db> ModuleItemMap<'db> {
&self,
db: &'db dyn SourceDatabase,
path: &ModPath,
- ) -> Option<(ResolveValueResult, ResolvePathResultPrefixInfo)> {
+ ) -> Option<(ResolveValueResult, ResolvePathResultPrefixInfo, Visibility)> {
let (module_def, unresolved_idx, prefix_info) = self.def_map.resolve_path_locally(
self.local_def_map,
db,
@@ -1176,12 +1197,12 @@ impl<'db> ModuleItemMap<'db> {
);
match unresolved_idx {
None => {
- let value = to_value_ns(module_def, self.def_map)?;
- Some((ResolveValueResult::ValueNs(value), prefix_info))
+ let (value, vis) = to_value_ns(module_def, self.def_map)?;
+ Some((ResolveValueResult::ValueNs(value), prefix_info, vis))
}
Some(unresolved_idx) => {
- let def = module_def.take_types()?;
- let ty = match def {
+ let res = module_def.take_types_full()?;
+ let ty = match res.def {
ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
ModuleDefId::TraitId(it) => TypeNs::TraitId(it),
ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it),
@@ -1194,7 +1215,7 @@ impl<'db> ModuleItemMap<'db> {
| ModuleDefId::MacroId(_)
| ModuleDefId::StaticId(_) => return None,
};
- Some((ResolveValueResult::Partial(ty, unresolved_idx), prefix_info))
+ Some((ResolveValueResult::Partial(ty, unresolved_idx), prefix_info, res.vis))
}
}
}
@@ -1203,8 +1224,13 @@ impl<'db> ModuleItemMap<'db> {
&self,
db: &dyn SourceDatabase,
path: &ModPath,
- ) -> Option<(TypeNs, Option<usize>, Option<ImportOrExternCrate>, ResolvePathResultPrefixInfo)>
- {
+ ) -> Option<(
+ TypeNs,
+ Option<usize>,
+ Option<ImportOrExternCrate>,
+ ResolvePathResultPrefixInfo,
+ Visibility,
+ )> {
let (module_def, idx, prefix_info) = self.def_map.resolve_path_locally(
self.local_def_map,
db,
@@ -1212,17 +1238,22 @@ impl<'db> ModuleItemMap<'db> {
path,
BuiltinShadowMode::Other,
);
- let (res, import) = to_type_ns(module_def)?;
- Some((res, idx, import, prefix_info))
+ let (res, import, vis) = to_type_ns(module_def)?;
+ Some((res, idx, import, prefix_info, vis))
}
}
-fn to_value_ns(per_ns: PerNs, def_map: &DefMap) -> Option<ValueNs> {
- let def = per_ns.take_values().or_else(|| {
- let Some(MacroId::ProcMacroId(proc_macro)) = per_ns.take_macros() else { return None };
+fn to_value_ns(per_ns: PerNs, def_map: &DefMap) -> Option<(ValueNs, Visibility)> {
+ let (def, vis) = per_ns.take_values_full().map(|res| (res.def, res.vis)).or_else(|| {
+ let Some(MacrosItem { def: MacroId::ProcMacroId(proc_macro), vis, .. }) =
+ per_ns.take_macros_full()
+ else {
+ return None;
+ };
// If we cannot resolve to value ns, but we can resolve to a proc macro, and this is the crate
// defining this proc macro - inside this crate, we should treat the macro as a function.
- def_map.proc_macro_as_fn(proc_macro).map(ModuleDefId::FunctionId)
+ let def = ModuleDefId::FunctionId(def_map.proc_macro_as_fn(proc_macro)?);
+ Some((def, vis))
})?;
let res = match def {
ModuleDefId::FunctionId(it) => ValueNs::FunctionId(it),
@@ -1238,10 +1269,10 @@ fn to_value_ns(per_ns: PerNs, def_map: &DefMap) -> Option<ValueNs> {
| ModuleDefId::MacroId(_)
| ModuleDefId::ModuleId(_) => return None,
};
- Some(res)
+ Some((res, vis))
}
-fn to_type_ns(per_ns: PerNs) -> Option<(TypeNs, Option<ImportOrExternCrate>)> {
+fn to_type_ns(per_ns: PerNs) -> Option<(TypeNs, Option<ImportOrExternCrate>, Visibility)> {
let def = per_ns.take_types_full()?;
let res = match def.def {
ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
@@ -1259,7 +1290,7 @@ fn to_type_ns(per_ns: PerNs) -> Option<(TypeNs, Option<ImportOrExternCrate>)> {
| ModuleDefId::MacroId(_)
| ModuleDefId::StaticId(_) => return None,
};
- Some((res, def.import))
+ Some((res, def.import, def.vis))
}
#[derive(Default)]