Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/lib.rs')
-rw-r--r--crates/hir/src/lib.rs34
1 files changed, 16 insertions, 18 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index a38c0211e8..42e4483789 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -415,24 +415,18 @@ impl ModuleDef {
def.diagnostics(db, &mut acc);
}
- let vd: Option<(VariantDef, Arc<VariantData>)> = match self {
- ModuleDef::Adt(Adt::Struct(it)) => {
- Some((it.into(), db.struct_data(it.id).variant_data.clone()))
- }
- ModuleDef::Adt(Adt::Union(it)) => {
- Some((it.into(), db.union_data(it.id).variant_data.clone()))
- }
- ModuleDef::Variant(it) => {
- Some((it.into(), db.enum_variant_data(it.id).variant_data.clone()))
- }
+ let fields = match self {
+ ModuleDef::Adt(Adt::Struct(it)) => Some(it.fields(db)),
+ ModuleDef::Adt(Adt::Union(it)) => Some(it.fields(db)),
+ ModuleDef::Variant(it) => Some(it.fields(db)),
_ => None,
};
- if let Some((parent, vd)) = vd {
- for (id, fd) in vd.fields().iter() {
- if !fd.has_default {
+ if let Some(fields) = fields {
+ for field in fields {
+ if !field.has_default {
continue;
}
- let def: DefWithBody = DefWithBody::Field(Field { parent, id });
+ let def: DefWithBody = field.into();
def.diagnostics(db, &mut acc, style_lints);
}
}
@@ -1258,6 +1252,7 @@ impl From<&Field> for DefWithBodyId {
pub struct Field {
pub(crate) parent: VariantDef,
pub(crate) id: LocalFieldId,
+ pub(crate) has_default: bool,
}
#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash)]
@@ -1423,7 +1418,7 @@ impl Struct {
.variant_data
.fields()
.iter()
- .map(|(id, _)| Field { parent: self.into(), id })
+ .map(|(id, d)| Field { parent: self.into(), id, has_default: d.has_default })
.collect()
}
@@ -1485,7 +1480,7 @@ impl Union {
.variant_data
.fields()
.iter()
- .map(|(id, _)| Field { parent: self.into(), id })
+ .map(|(id, d)| Field { parent: self.into(), id, has_default: d.has_default })
.collect()
}
@@ -1615,7 +1610,7 @@ impl Variant {
self.variant_data(db)
.fields()
.iter()
- .map(|(id, _)| Field { parent: self.into(), id })
+ .map(|(id, d)| Field { parent: self.into(), id, has_default: d.has_default })
.collect()
}
@@ -5203,10 +5198,13 @@ impl Type {
_ => return Vec::new(),
};
+ let var_data = db.variant_data(variant_id);
+ let fields = var_data.fields();
db.field_types(variant_id)
.iter()
.map(|(local_id, ty)| {
- let def = Field { parent: variant_id.into(), id: local_id };
+ let has_default = fields[local_id].has_default;
+ let def = Field { parent: variant_id.into(), id: local_id, has_default };
let ty = ty.clone().substitute(Interner, substs);
(def, self.derived(ty))
})