Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/nameres/path_resolution.rs')
-rw-r--r--crates/hir-def/src/nameres/path_resolution.rs51
1 files changed, 32 insertions, 19 deletions
diff --git a/crates/hir-def/src/nameres/path_resolution.rs b/crates/hir-def/src/nameres/path_resolution.rs
index 389dabdbc8..01f79f042f 100644
--- a/crates/hir-def/src/nameres/path_resolution.rs
+++ b/crates/hir-def/src/nameres/path_resolution.rs
@@ -11,18 +11,18 @@
//! `ReachedFixedPoint` signals about this.
use base_db::Edition;
-use hir_expand::name::Name;
+use hir_expand::{name::Name, Lookup};
use triomphe::Arc;
use crate::{
- data::adt::VariantData,
db::DefDatabase,
item_scope::{ImportOrExternCrate, BUILTIN_SCOPE},
+ item_tree::Fields,
nameres::{sub_namespace_match, BlockInfo, BuiltinShadowMode, DefMap, MacroSubNs},
path::{ModPath, PathKind},
per_ns::PerNs,
visibility::{RawVisibility, Visibility},
- AdtId, CrateId, EnumVariantId, LocalModuleId, ModuleDefId,
+ AdtId, CrateId, LocalModuleId, ModuleDefId,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -355,29 +355,42 @@ impl DefMap {
ModuleDefId::AdtId(AdtId::EnumId(e)) => {
// enum variant
cov_mark::hit!(can_import_enum_variant);
- let enum_data = db.enum_data(e);
- match enum_data.variant(segment) {
- Some(local_id) => {
- let variant = EnumVariantId { parent: e, local_id };
- match &*enum_data.variants[local_id].variant_data {
- VariantData::Record(_) => {
- PerNs::types(variant.into(), Visibility::Public, None)
- }
- VariantData::Tuple(_) | VariantData::Unit => PerNs::both(
- variant.into(),
- variant.into(),
- Visibility::Public,
- None,
- ),
+ let def_map;
+
+ let loc = e.lookup(db);
+ let tree = loc.id.item_tree(db);
+ let current_def_map =
+ self.krate == loc.container.krate && self.block_id() == loc.container.block;
+ let res = if current_def_map {
+ &self.enum_definitions[&e]
+ } else {
+ def_map = loc.container.def_map(db);
+ &def_map.enum_definitions[&e]
+ }
+ .iter()
+ .find_map(|&variant| {
+ let variant_data = &tree[variant.lookup(db).id.value];
+ (variant_data.name == *segment).then(|| match variant_data.fields {
+ Fields::Record(_) => {
+ PerNs::types(variant.into(), Visibility::Public, None)
}
- }
+ Fields::Tuple(_) | Fields::Unit => PerNs::both(
+ variant.into(),
+ variant.into(),
+ Visibility::Public,
+ None,
+ ),
+ })
+ });
+ match res {
+ Some(res) => res,
None => {
return ResolvePathResult::with(
PerNs::types(e.into(), vis, imp),
ReachedFixedPoint::Yes,
Some(i),
Some(self.krate),
- );
+ )
}
}
}