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 | 83 |
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)] |