Skip to content

Commit 9fa46ff

Browse files
committed
Use Id for variats
1 parent 17680f6 commit 9fa46ff

File tree

7 files changed

+60
-52
lines changed

7 files changed

+60
-52
lines changed

crates/ra_hir/src/code_model.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -534,14 +534,6 @@ impl VariantDef {
534534
}
535535
}
536536

537-
pub(crate) fn field(self, db: &impl HirDatabase, name: &Name) -> Option<StructField> {
538-
match self {
539-
VariantDef::Struct(it) => it.field(db, name),
540-
VariantDef::Union(it) => it.field(db, name),
541-
VariantDef::EnumVariant(it) => it.field(db, name),
542-
}
543-
}
544-
545537
pub fn module(self, db: &impl HirDatabase) -> Module {
546538
match self {
547539
VariantDef::Struct(it) => it.module(db),

crates/ra_hir/src/source_binder.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,12 @@ impl SourceAnalyzer {
229229

230230
pub fn resolve_record_literal(&self, record_lit: &ast::RecordLit) -> Option<crate::VariantDef> {
231231
let expr_id = self.expr_id(&record_lit.clone().into())?;
232-
self.infer.as_ref()?.variant_resolution_for_expr(expr_id)
232+
self.infer.as_ref()?.variant_resolution_for_expr(expr_id).map(|it| it.into())
233233
}
234234

235235
pub fn resolve_record_pattern(&self, record_pat: &ast::RecordPat) -> Option<crate::VariantDef> {
236236
let pat_id = self.pat_id(&record_pat.clone().into())?;
237-
self.infer.as_ref()?.variant_resolution_for_pat(pat_id)
237+
self.infer.as_ref()?.variant_resolution_for_pat(pat_id).map(|it| it.into())
238238
}
239239

240240
pub fn resolve_macro_call(

crates/ra_hir/src/ty/infer.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use hir_def::{
2828
path::{known, Path},
2929
resolver::{HasResolver, Resolver, TypeNs},
3030
type_ref::{Mutability, TypeRef},
31-
AdtId, AssocItemId, DefWithBodyId, FunctionId, StructFieldId, TypeAliasId,
31+
AdtId, AssocItemId, DefWithBodyId, FunctionId, StructFieldId, TypeAliasId, VariantId,
3232
};
3333
use hir_expand::{diagnostics::DiagnosticSink, name};
3434
use ra_arena::map::ArenaMap;
@@ -41,7 +41,7 @@ use super::{
4141
ApplicationTy, InEnvironment, ProjectionTy, Substs, TraitEnvironment, TraitRef, Ty, TypeCtor,
4242
TypeWalk, Uncertain,
4343
};
44-
use crate::{db::HirDatabase, ty::infer::diagnostics::InferenceDiagnostic, VariantDef};
44+
use crate::{db::HirDatabase, ty::infer::diagnostics::InferenceDiagnostic};
4545

4646
macro_rules! ty_app {
4747
($ctor:pat, $param:pat) => {
@@ -124,7 +124,7 @@ pub struct InferenceResult {
124124
/// For each field in record literal, records the field it resolves to.
125125
record_field_resolutions: FxHashMap<ExprId, StructFieldId>,
126126
/// For each struct literal, records the variant it resolves to.
127-
variant_resolutions: FxHashMap<ExprOrPatId, VariantDef>,
127+
variant_resolutions: FxHashMap<ExprOrPatId, VariantId>,
128128
/// For each associated item record what it resolves to
129129
assoc_resolutions: FxHashMap<ExprOrPatId, AssocItemId>,
130130
diagnostics: Vec<InferenceDiagnostic>,
@@ -143,10 +143,10 @@ impl InferenceResult {
143143
pub fn record_field_resolution(&self, expr: ExprId) -> Option<StructFieldId> {
144144
self.record_field_resolutions.get(&expr).copied()
145145
}
146-
pub fn variant_resolution_for_expr(&self, id: ExprId) -> Option<VariantDef> {
146+
pub fn variant_resolution_for_expr(&self, id: ExprId) -> Option<VariantId> {
147147
self.variant_resolutions.get(&id.into()).copied()
148148
}
149-
pub fn variant_resolution_for_pat(&self, id: PatId) -> Option<VariantDef> {
149+
pub fn variant_resolution_for_pat(&self, id: PatId) -> Option<VariantId> {
150150
self.variant_resolutions.get(&id.into()).copied()
151151
}
152152
pub fn assoc_resolutions_for_expr(&self, id: ExprId) -> Option<AssocItemId> {
@@ -248,7 +248,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
248248
self.result.field_resolutions.insert(expr, field);
249249
}
250250

251-
fn write_variant_resolution(&mut self, id: ExprOrPatId, variant: VariantDef) {
251+
fn write_variant_resolution(&mut self, id: ExprOrPatId, variant: VariantId) {
252252
self.result.variant_resolutions.insert(id, variant);
253253
}
254254

@@ -511,7 +511,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
511511
})
512512
}
513513

514-
fn resolve_variant(&mut self, path: Option<&Path>) -> (Ty, Option<VariantDef>) {
514+
fn resolve_variant(&mut self, path: Option<&Path>) -> (Ty, Option<VariantId>) {
515515
let path = match path {
516516
Some(path) => path,
517517
None => return (Ty::Unknown, None),
@@ -524,13 +524,13 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
524524
let substs = Ty::substs_from_path(self.db, resolver, path, strukt.into());
525525
let ty = self.db.ty(strukt.into());
526526
let ty = self.insert_type_vars(ty.apply_substs(substs));
527-
(ty, Some(VariantDef::Struct(strukt.into())))
527+
(ty, Some(strukt.into()))
528528
}
529529
Some(TypeNs::EnumVariantId(var)) => {
530530
let substs = Ty::substs_from_path(self.db, resolver, path, var.into());
531531
let ty = self.db.ty(var.parent.into());
532532
let ty = self.insert_type_vars(ty.apply_substs(substs));
533-
(ty, Some(VariantDef::EnumVariant(var.into())))
533+
(ty, Some(var.into()))
534534
}
535535
Some(_) | None => (Ty::Unknown, None),
536536
}

crates/ra_hir/src/ty/infer/expr.rs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ use hir_expand::name::{self, Name};
1616
use crate::{
1717
db::HirDatabase,
1818
ty::{
19-
autoderef, method_resolution, op, traits::InEnvironment, CallableDef, InferTy, IntTy,
20-
Mutability, Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor,
21-
TypeWalk, Uncertain,
19+
autoderef, method_resolution, op, traits::InEnvironment, utils::variant_data, CallableDef,
20+
InferTy, IntTy, Mutability, Obligation, ProjectionPredicate, ProjectionTy, Substs,
21+
TraitRef, Ty, TypeCtor, TypeWalk, Uncertain,
2222
},
2323
};
2424

@@ -218,22 +218,26 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
218218
let substs = ty.substs().unwrap_or_else(Substs::empty);
219219
let field_types =
220220
def_id.map(|it| self.db.field_types(it.into())).unwrap_or_default();
221+
let variant_data = def_id.map(|it| variant_data(self.db, it));
221222
for (field_idx, field) in fields.iter().enumerate() {
222-
let field_def = def_id.and_then(|it| match it.field(self.db, &field.name) {
223-
Some(field) => Some(field),
224-
None => {
225-
self.push_diagnostic(InferenceDiagnostic::NoSuchField {
226-
expr: tgt_expr,
227-
field: field_idx,
228-
});
229-
None
230-
}
231-
});
223+
let field_def =
224+
variant_data.as_ref().and_then(|it| match it.field(&field.name) {
225+
Some(local_id) => {
226+
Some(StructFieldId { parent: def_id.unwrap(), local_id })
227+
}
228+
None => {
229+
self.push_diagnostic(InferenceDiagnostic::NoSuchField {
230+
expr: tgt_expr,
231+
field: field_idx,
232+
});
233+
None
234+
}
235+
});
232236
if let Some(field_def) = field_def {
233-
self.result.record_field_resolutions.insert(field.expr, field_def.into());
237+
self.result.record_field_resolutions.insert(field.expr, field_def);
234238
}
235239
let field_ty = field_def
236-
.map_or(Ty::Unknown, |it| field_types[it.id].clone())
240+
.map_or(Ty::Unknown, |it| field_types[it.local_id].clone())
237241
.subst(&substs);
238242
self.infer_expr_coerce(field.expr, &Expectation::has_type(field_ty));
239243
}

crates/ra_hir/src/ty/infer/pat.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use test_utils::tested_by;
1414
use super::{BindingMode, InferenceContext};
1515
use crate::{
1616
db::HirDatabase,
17-
ty::{Substs, Ty, TypeCtor, TypeWalk},
17+
ty::{utils::variant_data, Substs, Ty, TypeCtor, TypeWalk},
1818
};
1919

2020
impl<'a, D: HirDatabase> InferenceContext<'a, D> {
@@ -26,16 +26,18 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
2626
default_bm: BindingMode,
2727
) -> Ty {
2828
let (ty, def) = self.resolve_variant(path);
29-
29+
let var_data = def.map(|it| variant_data(self.db, it));
3030
self.unify(&ty, expected);
3131

3232
let substs = ty.substs().unwrap_or_else(Substs::empty);
3333

3434
let field_tys = def.map(|it| self.db.field_types(it.into())).unwrap_or_default();
35+
3536
for (i, &subpat) in subpats.iter().enumerate() {
36-
let expected_ty = def
37-
.and_then(|d| d.field(self.db, &Name::new_tuple_field(i)))
38-
.map_or(Ty::Unknown, |field| field_tys[field.id].clone())
37+
let expected_ty = var_data
38+
.as_ref()
39+
.and_then(|d| d.field(&Name::new_tuple_field(i)))
40+
.map_or(Ty::Unknown, |field| field_tys[field].clone())
3941
.subst(&substs);
4042
let expected_ty = self.normalize_associated_types_in(expected_ty);
4143
self.infer_pat(subpat, &expected_ty, default_bm);
@@ -53,6 +55,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
5355
id: PatId,
5456
) -> Ty {
5557
let (ty, def) = self.resolve_variant(path);
58+
let var_data = def.map(|it| variant_data(self.db, it));
5659
if let Some(variant) = def {
5760
self.write_variant_resolution(id.into(), variant);
5861
}
@@ -63,10 +66,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
6366

6467
let field_tys = def.map(|it| self.db.field_types(it.into())).unwrap_or_default();
6568
for subpat in subpats {
66-
let matching_field = def.and_then(|it| it.field(self.db, &subpat.name));
67-
let expected_ty = matching_field
68-
.map_or(Ty::Unknown, |field| field_tys[field.id].clone())
69-
.subst(&substs);
69+
let matching_field = var_data.as_ref().and_then(|it| it.field(&subpat.name));
70+
let expected_ty =
71+
matching_field.map_or(Ty::Unknown, |field| field_tys[field].clone()).subst(&substs);
7072
let expected_ty = self.normalize_associated_types_in(expected_ty);
7173
self.infer_pat(subpat.pat, &expected_ty, default_bm);
7274
}

crates/ra_hir/src/ty/lower.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use crate::{
2828
db::HirDatabase,
2929
ty::{
3030
primitive::{FloatTy, IntTy},
31-
utils::{all_super_traits, associated_type_by_name_including_super_traits},
31+
utils::{all_super_traits, associated_type_by_name_including_super_traits, variant_data},
3232
},
3333
util::make_mut_slice,
3434
Adt, Const, Enum, EnumVariant, Function, ImplBlock, ModuleDef, Path, Static, Struct, Trait,
@@ -514,13 +514,11 @@ pub(crate) fn field_types_query(
514514
db: &impl HirDatabase,
515515
variant_id: VariantId,
516516
) -> Arc<ArenaMap<LocalStructFieldId, Ty>> {
517-
let (resolver, var_data) = match variant_id {
518-
VariantId::StructId(it) => (it.resolver(db), db.struct_data(it).variant_data.clone()),
519-
VariantId::UnionId(it) => (it.resolver(db), db.union_data(it).variant_data.clone()),
520-
VariantId::EnumVariantId(it) => (
521-
it.parent.resolver(db),
522-
db.enum_data(it.parent).variants[it.local_id].variant_data.clone(),
523-
),
517+
let var_data = variant_data(db, variant_id);
518+
let resolver = match variant_id {
519+
VariantId::StructId(it) => it.resolver(db),
520+
VariantId::UnionId(it) => it.resolver(db),
521+
VariantId::EnumVariantId(it) => it.parent.resolver(db),
524522
};
525523
let mut res = ArenaMap::default();
526524
for (field_id, field_data) in var_data.fields().iter() {

crates/ra_hir/src/ty/utils.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
//! Helper functions for working with def, which don't need to be a separate
22
//! query, but can't be computed directly from `*Data` (ie, which need a `db`).
3+
use std::sync::Arc;
34

45
use hir_def::{
6+
adt::VariantData,
57
db::DefDatabase,
68
resolver::{HasResolver, TypeNs},
79
type_ref::TypeRef,
8-
TraitId, TypeAliasId,
10+
TraitId, TypeAliasId, VariantId,
911
};
1012
use hir_expand::name::{self, Name};
1113

@@ -61,3 +63,13 @@ pub(super) fn associated_type_by_name_including_super_traits(
6163
.into_iter()
6264
.find_map(|t| db.trait_data(t).associated_type_by_name(name))
6365
}
66+
67+
pub(super) fn variant_data(db: &impl DefDatabase, var: VariantId) -> Arc<VariantData> {
68+
match var {
69+
VariantId::StructId(it) => db.struct_data(it).variant_data.clone(),
70+
VariantId::UnionId(it) => db.union_data(it).variant_data.clone(),
71+
VariantId::EnumVariantId(it) => {
72+
db.enum_data(it.parent).variants[it.local_id].variant_data.clone()
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)