Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/utils.rs')
-rw-r--r--crates/hir-ty/src/utils.rs26
1 files changed, 14 insertions, 12 deletions
diff --git a/crates/hir-ty/src/utils.rs b/crates/hir-ty/src/utils.rs
index 75b8b9afa7..2cdee5a15a 100644
--- a/crates/hir-ty/src/utils.rs
+++ b/crates/hir-ty/src/utils.rs
@@ -19,9 +19,8 @@ use hir_def::{
lang_item::LangItem,
resolver::{HasResolver, TypeNs},
type_ref::{TraitBoundModifier, TypeRef},
- ConstParamId, EnumId, EnumVariantId, FunctionId, GenericDefId, ItemContainerId,
- LocalEnumVariantId, Lookup, OpaqueInternableThing, TraitId, TypeAliasId, TypeOrConstParamId,
- TypeParamId,
+ ConstParamId, EnumId, EnumVariantId, FunctionId, GenericDefId, ItemContainerId, Lookup,
+ OpaqueInternableThing, TraitId, TypeAliasId, TypeOrConstParamId, TypeParamId,
};
use hir_expand::name::Name;
use intern::Interned;
@@ -355,7 +354,7 @@ fn parent_generic_def(db: &dyn DefDatabase, def: GenericDefId) -> Option<Generic
GenericDefId::FunctionId(it) => it.lookup(db).container,
GenericDefId::TypeAliasId(it) => it.lookup(db).container,
GenericDefId::ConstId(it) => it.lookup(db).container,
- GenericDefId::EnumVariantId(it) => return Some(it.parent.into()),
+ GenericDefId::EnumVariantId(it) => return Some(it.lookup(db).parent.into()),
GenericDefId::AdtId(_)
| GenericDefId::TraitId(_)
| GenericDefId::ImplId(_)
@@ -435,10 +434,12 @@ pub(crate) fn detect_variant_from_bytes<'a>(
trait_env: Arc<TraitEnvironment>,
b: &[u8],
e: EnumId,
-) -> Option<(LocalEnumVariantId, &'a Layout)> {
+) -> Option<(EnumVariantId, &'a Layout)> {
let krate = trait_env.krate;
let (var_id, var_layout) = match &layout.variants {
- hir_def::layout::Variants::Single { index } => (index.0, &*layout),
+ hir_def::layout::Variants::Single { index } => {
+ (db.enum_data(e).variants[index.0].0, layout)
+ }
hir_def::layout::Variants::Multiple { tag, tag_encoding, variants, .. } => {
let target_data_layout = db.target_data_layout(krate)?;
let size = tag.size(&*target_data_layout).bytes_usize();
@@ -446,11 +447,12 @@ pub(crate) fn detect_variant_from_bytes<'a>(
let tag = i128::from_le_bytes(pad16(&b[offset..offset + size], false));
match tag_encoding {
TagEncoding::Direct => {
- let x = variants.iter_enumerated().find(|x| {
- db.const_eval_discriminant(EnumVariantId { parent: e, local_id: x.0 .0 })
- == Ok(tag)
- })?;
- (x.0 .0, x.1)
+ let (var_idx, layout) =
+ variants.iter_enumerated().find_map(|(var_idx, v)| {
+ let def = db.enum_data(e).variants[var_idx.0].0;
+ (db.const_eval_discriminant(def) == Ok(tag)).then_some((def, v))
+ })?;
+ (var_idx, layout)
}
TagEncoding::Niche { untagged_variant, niche_start, .. } => {
let candidate_tag = tag.wrapping_sub(*niche_start as i128) as usize;
@@ -460,7 +462,7 @@ pub(crate) fn detect_variant_from_bytes<'a>(
.filter(|x| x != untagged_variant)
.nth(candidate_tag)
.unwrap_or(*untagged_variant);
- (variant.0, &variants[variant])
+ (db.enum_data(e).variants[variant.0].0, &variants[variant])
}
}
}