Skip to content

Commit 7dd7017

Browse files
Merge #8376
8376: infer: remove `record_field_resolutions` field r=flodiebold a=jonas-schievink It stores no useful data, since we can derive all fields from `variant_resolutions` Co-authored-by: Jonas Schievink <[email protected]>
2 parents 74711de + e975230 commit 7dd7017

File tree

8 files changed

+35
-40
lines changed

8 files changed

+35
-40
lines changed

crates/hir/src/source_analyzer.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,23 +161,26 @@ impl SourceAnalyzer {
161161
db: &dyn HirDatabase,
162162
field: &ast::RecordExprField,
163163
) -> Option<(Field, Option<Local>)> {
164-
let expr_id =
165-
self.body_source_map.as_ref()?.node_field(InFile::new(self.file_id, field))?;
164+
let record_expr = ast::RecordExpr::cast(field.syntax().parent().and_then(|p| p.parent())?)?;
165+
let expr = ast::Expr::from(record_expr);
166+
let expr_id = self.body_source_map.as_ref()?.node_expr(InFile::new(self.file_id, &expr))?;
166167

168+
let local_name = field.field_name()?.as_name();
167169
let local = if field.name_ref().is_some() {
168170
None
169171
} else {
170-
let local_name = field.field_name()?.as_name();
171-
let path = ModPath::from_segments(PathKind::Plain, once(local_name));
172+
let path = ModPath::from_segments(PathKind::Plain, once(local_name.clone()));
172173
match self.resolver.resolve_path_in_value_ns_fully(db.upcast(), &path) {
173174
Some(ValueNs::LocalBinding(pat_id)) => {
174175
Some(Local { pat_id, parent: self.resolver.body_owner()? })
175176
}
176177
_ => None,
177178
}
178179
};
179-
let struct_field = self.infer.as_ref()?.record_field_resolution(expr_id)?;
180-
Some((struct_field.into(), local))
180+
let variant = self.infer.as_ref()?.variant_resolution_for_expr(expr_id)?;
181+
let variant_data = variant.variant_data(db.upcast());
182+
let field = FieldId { parent: variant, local_id: variant_data.field(&local_name)? };
183+
Some((field.into(), local))
181184
}
182185

183186
pub(crate) fn resolve_record_pat_field(

crates/hir_def/src/lib.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ use std::{
5656
sync::Arc,
5757
};
5858

59+
use adt::VariantData;
5960
use base_db::{impl_intern_key, salsa, CrateId};
6061
use hir_expand::{
6162
ast_id_map::FileAstId,
@@ -442,6 +443,18 @@ pub enum VariantId {
442443
}
443444
impl_from!(EnumVariantId, StructId, UnionId for VariantId);
444445

446+
impl VariantId {
447+
pub fn variant_data(self, db: &dyn db::DefDatabase) -> Arc<VariantData> {
448+
match self {
449+
VariantId::StructId(it) => db.struct_data(it).variant_data.clone(),
450+
VariantId::UnionId(it) => db.union_data(it).variant_data.clone(),
451+
VariantId::EnumVariantId(it) => {
452+
db.enum_data(it.parent).variants[it.local_id].variant_data.clone()
453+
}
454+
}
455+
}
456+
}
457+
445458
trait Intern {
446459
type ID;
447460
fn intern(self, db: &dyn db::DefDatabase) -> Self::ID;

crates/hir_ty/src/diagnostics/expr.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use crate::{
1414
MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkOrSomeInTailExpr,
1515
MissingPatFields, RemoveThisSemicolon,
1616
},
17-
utils::variant_data,
1817
AdtId, InferenceResult, Interner, TyExt, TyKind,
1918
};
2019

@@ -104,7 +103,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> {
104103
let root = source_ptr.file_syntax(db.upcast());
105104
if let ast::Expr::RecordExpr(record_expr) = &source_ptr.value.to_node(&root) {
106105
if let Some(_) = record_expr.record_expr_field_list() {
107-
let variant_data = variant_data(db.upcast(), variant_def);
106+
let variant_data = variant_def.variant_data(db.upcast());
108107
let missed_fields = missed_fields
109108
.into_iter()
110109
.map(|idx| variant_data.fields()[idx].name.clone())
@@ -135,7 +134,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> {
135134
let root = source_ptr.file_syntax(db.upcast());
136135
if let ast::Pat::RecordPat(record_pat) = expr.to_node(&root) {
137136
if let Some(_) = record_pat.record_pat_field_list() {
138-
let variant_data = variant_data(db.upcast(), variant_def);
137+
let variant_data = variant_def.variant_data(db.upcast());
139138
let missed_fields = missed_fields
140139
.into_iter()
141140
.map(|idx| variant_data.fields()[idx].name.clone())
@@ -453,7 +452,7 @@ pub fn record_literal_missing_fields(
453452
return None;
454453
}
455454

456-
let variant_data = variant_data(db.upcast(), variant_def);
455+
let variant_data = variant_def.variant_data(db.upcast());
457456

458457
let specified_fields: FxHashSet<_> = fields.iter().map(|f| &f.name).collect();
459458
let missed_fields: Vec<LocalFieldId> = variant_data
@@ -483,7 +482,7 @@ pub fn record_pattern_missing_fields(
483482
return None;
484483
}
485484

486-
let variant_data = variant_data(db.upcast(), variant_def);
485+
let variant_data = variant_def.variant_data(db.upcast());
487486

488487
let specified_fields: FxHashSet<_> = fields.iter().map(|f| &f.name).collect();
489488
let missed_fields: Vec<LocalFieldId> = variant_data

crates/hir_ty/src/infer.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,6 @@ pub struct InferenceResult {
131131
method_resolutions: FxHashMap<ExprId, FunctionId>,
132132
/// For each field access expr, records the field it resolves to.
133133
field_resolutions: FxHashMap<ExprId, FieldId>,
134-
/// For each field in record literal, records the field it resolves to.
135-
record_field_resolutions: FxHashMap<ExprId, FieldId>,
136134
record_pat_field_resolutions: FxHashMap<PatId, FieldId>,
137135
/// For each struct literal, records the variant it resolves to.
138136
variant_resolutions: FxHashMap<ExprOrPatId, VariantId>,
@@ -153,9 +151,6 @@ impl InferenceResult {
153151
pub fn field_resolution(&self, expr: ExprId) -> Option<FieldId> {
154152
self.field_resolutions.get(&expr).copied()
155153
}
156-
pub fn record_field_resolution(&self, expr: ExprId) -> Option<FieldId> {
157-
self.record_field_resolutions.get(&expr).copied()
158-
}
159154
pub fn record_pat_field_resolution(&self, pat: PatId) -> Option<FieldId> {
160155
self.record_pat_field_resolutions.get(&pat).copied()
161156
}

crates/hir_ty/src/infer/expr.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::{
2121
primitive::{self, UintTy},
2222
static_lifetime, to_chalk_trait_id,
2323
traits::{chalk::from_chalk, FnTrait},
24-
utils::{generics, variant_data, Generics},
24+
utils::{generics, Generics},
2525
AdtId, Binders, CallableDefId, FnPointer, FnSig, FnSubst, InEnvironment, Interner,
2626
ProjectionTyExt, Rawness, Scalar, Substitution, TraitRef, Ty, TyBuilder, TyExt, TyKind,
2727
TypeWalk,
@@ -414,7 +414,7 @@ impl<'a> InferenceContext<'a> {
414414

415415
let substs = ty.substs().cloned().unwrap_or_else(|| Substitution::empty(&Interner));
416416
let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default();
417-
let variant_data = def_id.map(|it| variant_data(self.db.upcast(), it));
417+
let variant_data = def_id.map(|it| it.variant_data(self.db.upcast()));
418418
for field in fields.iter() {
419419
let field_def =
420420
variant_data.as_ref().and_then(|it| match it.field(&field.name) {
@@ -426,9 +426,6 @@ impl<'a> InferenceContext<'a> {
426426
None
427427
}
428428
});
429-
if let Some(field_def) = field_def {
430-
self.result.record_field_resolutions.insert(field.expr, field_def);
431-
}
432429
let field_ty = field_def.map_or(self.err_ty(), |it| {
433430
field_types[it.local_id].clone().substitute(&Interner, &substs)
434431
});

crates/hir_ty/src/infer/pat.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use hir_expand::name::Name;
1313

1414
use super::{BindingMode, Expectation, InferenceContext};
1515
use crate::{
16-
lower::lower_to_chalk_mutability, static_lifetime, utils::variant_data, Interner, Substitution,
17-
Ty, TyBuilder, TyExt, TyKind,
16+
lower::lower_to_chalk_mutability, static_lifetime, Interner, Substitution, Ty, TyBuilder,
17+
TyExt, TyKind,
1818
};
1919

2020
impl<'a> InferenceContext<'a> {
@@ -28,7 +28,7 @@ impl<'a> InferenceContext<'a> {
2828
ellipsis: Option<usize>,
2929
) -> Ty {
3030
let (ty, def) = self.resolve_variant(path);
31-
let var_data = def.map(|it| variant_data(self.db.upcast(), it));
31+
let var_data = def.map(|it| it.variant_data(self.db.upcast()));
3232
if let Some(variant) = def {
3333
self.write_variant_resolution(id.into(), variant);
3434
}
@@ -68,7 +68,7 @@ impl<'a> InferenceContext<'a> {
6868
id: PatId,
6969
) -> Ty {
7070
let (ty, def) = self.resolve_variant(path);
71-
let var_data = def.map(|it| variant_data(self.db.upcast(), it));
71+
let var_data = def.map(|it| it.variant_data(self.db.upcast()));
7272
if let Some(variant) = def {
7373
self.write_variant_resolution(id.into(), variant);
7474
}

crates/hir_ty/src/lower.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ use crate::{
3030
dummy_usize_const, static_lifetime, to_assoc_type_id, to_chalk_trait_id, to_placeholder_idx,
3131
traits::chalk::{Interner, ToChalk},
3232
utils::{
33-
all_super_trait_refs, associated_type_by_name_including_super_traits, generics,
34-
variant_data, Generics,
33+
all_super_trait_refs, associated_type_by_name_including_super_traits, generics, Generics,
3534
},
3635
AliasEq, AliasTy, Binders, BoundVar, CallableSig, DebruijnIndex, DynTy, FnPointer, FnSig,
3736
FnSubst, ImplTraitId, OpaqueTy, PolyFnSig, ProjectionTy, QuantifiedWhereClause,
@@ -879,7 +878,7 @@ pub(crate) fn field_types_query(
879878
db: &dyn HirDatabase,
880879
variant_id: VariantId,
881880
) -> Arc<ArenaMap<LocalFieldId, Binders<Ty>>> {
882-
let var_data = variant_data(db.upcast(), variant_id);
881+
let var_data = variant_id.variant_data(db.upcast());
883882
let (resolver, def): (_, GenericDefId) = match variant_id {
884883
VariantId::StructId(it) => (it.resolver(db.upcast()), it.into()),
885884
VariantId::UnionId(it) => (it.resolver(db.upcast()), it.into()),

crates/hir_ty/src/utils.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::sync::Arc;
44

55
use chalk_ir::{BoundVar, DebruijnIndex};
66
use hir_def::{
7-
adt::VariantData,
87
db::DefDatabase,
98
generics::{
109
GenericParams, TypeParamData, TypeParamProvenance, WherePredicate, WherePredicateTypeTarget,
@@ -13,7 +12,7 @@ use hir_def::{
1312
path::Path,
1413
resolver::{HasResolver, TypeNs},
1514
type_ref::TypeRef,
16-
AssocContainerId, GenericDefId, Lookup, TraitId, TypeAliasId, TypeParamId, VariantId,
15+
AssocContainerId, GenericDefId, Lookup, TraitId, TypeAliasId, TypeParamId,
1716
};
1817
use hir_expand::name::{name, Name};
1918

@@ -136,16 +135,6 @@ pub(super) fn associated_type_by_name_including_super_traits(
136135
})
137136
}
138137

139-
pub(super) fn variant_data(db: &dyn DefDatabase, var: VariantId) -> Arc<VariantData> {
140-
match var {
141-
VariantId::StructId(it) => db.struct_data(it).variant_data.clone(),
142-
VariantId::UnionId(it) => db.union_data(it).variant_data.clone(),
143-
VariantId::EnumVariantId(it) => {
144-
db.enum_data(it.parent).variants[it.local_id].variant_data.clone()
145-
}
146-
}
147-
}
148-
149138
/// Helper for mutating `Arc<[T]>` (i.e. `Arc::make_mut` for Arc slices).
150139
/// The underlying values are cloned if there are other strong references.
151140
pub(crate) fn make_mut_slice<T: Clone>(a: &mut Arc<[T]>) -> &mut [T] {

0 commit comments

Comments
 (0)