Skip to content

Commit 7e8ae7e

Browse files
Lowe field defaults to rustc_type_ir::Consts
This is needed so that IDE features can find their anon consts and work with them. We lower them in `field_types()`, which seemed appropriate (we need to know the type for the const, and creating another query doesn't seem worth it). We'll also need them for const eval, but currently default expressions are not handled in MIR.
1 parent aca875d commit 7e8ae7e

24 files changed

Lines changed: 119 additions & 80 deletions

File tree

crates/hir-ty/src/builtin_derive.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@ use rustc_type_ir::{
1717
};
1818

1919
use crate::{
20-
GenericPredicates,
20+
FieldType, GenericPredicates,
2121
db::HirDatabase,
2222
next_solver::{
2323
AliasTy, Clause, Clauses, DbInterner, EarlyBinder, GenericArgs, ParamEnv,
24-
StoredEarlyBinder, StoredTy, TraitRef, Ty, TyKind, Unnormalized, fold::fold_tys,
25-
generics::Generics,
24+
StoredEarlyBinder, TraitRef, Ty, TyKind, Unnormalized, fold::fold_tys, generics::Generics,
2625
},
2726
};
2827

@@ -333,7 +332,7 @@ fn simple_trait_predicates<'db>(
333332
fn extend_assoc_type_bounds<'db>(
334333
interner: DbInterner<'db>,
335334
assoc_type_bounds: &mut Vec<Clause<'db>>,
336-
fields: &ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>>,
335+
fields: &ArenaMap<LocalFieldId, FieldType>,
337336
trait_id: TraitId,
338337
trait_: BuiltinDeriveImplTrait,
339338
) {
@@ -365,7 +364,7 @@ fn extend_assoc_type_bounds<'db>(
365364

366365
let mut visitor = ProjectionFinder { interner, assoc_type_bounds, trait_id, trait_ };
367366
for (_, field) in fields.iter() {
368-
field.get().instantiate_identity().skip_norm_wip().visit_with(&mut visitor);
367+
field.ty().instantiate_identity().skip_norm_wip().visit_with(&mut visitor);
369368
}
370369
}
371370

crates/hir-ty/src/db.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ use stdx::impl_from;
2222
use triomphe::Arc;
2323

2424
use crate::{
25-
GenericDefaultsRef, GenericPredicates, ImplTraitId, InferBodyId, TyDefId, TyLoweringResult,
26-
ValueTyDefId,
25+
FieldType, GenericDefaultsRef, GenericPredicates, ImplTraitId, InferBodyId, TyDefId,
26+
TyLoweringResult, ValueTyDefId,
2727
consteval::ConstEvalError,
2828
dyn_compatibility::DynCompatibilityViolation,
2929
layout::{Layout, LayoutError},
@@ -225,11 +225,11 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
225225
fn field_types_with_diagnostics(
226226
&self,
227227
var: VariantId,
228-
) -> &TyLoweringResult<ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>>>;
228+
) -> &TyLoweringResult<ArenaMap<LocalFieldId, FieldType>>;
229229

230230
#[salsa::invoke(crate::lower::field_types_query)]
231231
#[salsa::transparent]
232-
fn field_types(&self, var: VariantId) -> &ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>>;
232+
fn field_types(&self, var: VariantId) -> &ArenaMap<LocalFieldId, FieldType>;
233233

234234
#[salsa::invoke(crate::lower::callable_item_signature)]
235235
#[salsa::transparent]

crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ impl<'a, 'db> MatchCheckCtx<'a, 'db> {
148148
let fields_len = variant.fields(self.db).fields().len() as u32;
149149

150150
(0..fields_len).map(|idx| LocalFieldId::from_raw(idx.into())).map(move |fid| {
151-
let ty = field_tys[fid].get().instantiate(self.infcx.interner, substs).skip_norm_wip();
151+
let ty = field_tys[fid].ty().instantiate(self.infcx.interner, substs).skip_norm_wip();
152152
let ty = self
153153
.infcx
154154
.at(&ObligationCause::dummy(), self.env)

crates/hir-ty/src/display.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ use span::Edition;
5151
use stdx::never;
5252

5353
use crate::{
54-
CallableDefId, ImplTraitId, MemoryMap, ParamEnvAndCrate, consteval,
54+
CallableDefId, FieldType, ImplTraitId, MemoryMap, ParamEnvAndCrate, consteval,
5555
db::{GeneralConstId, HirDatabase},
5656
generics::{ProvenanceSplit, generics},
5757
layout::Layout,
@@ -60,8 +60,8 @@ use crate::{
6060
next_solver::{
6161
AliasTy, Allocation, Clause, ClauseKind, Const, ConstKind, DbInterner,
6262
ExistentialPredicate, FnSig, GenericArg, GenericArgKind, GenericArgs, ParamEnv, PolyFnSig,
63-
Region, StoredEarlyBinder, StoredTy, Term, TermId, TermKind, TraitPredicate, TraitRef, Ty,
64-
TyKind, TypingMode, Unnormalized, ValTree,
63+
Region, Term, TermId, TermKind, TraitPredicate, TraitRef, Ty, TyKind, TypingMode,
64+
Unnormalized, ValTree,
6565
abi::Safety,
6666
infer::{DbInternerInferExt, traits::ObligationCause},
6767
},
@@ -1198,7 +1198,7 @@ fn render_const_scalar_from_valtree_inner<'db>(
11981198
fn render_variant_after_name<'db>(
11991199
data: &VariantFields,
12001200
f: &mut HirFormatter<'_, 'db>,
1201-
field_types: &'db ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>>,
1201+
field_types: &'db ArenaMap<LocalFieldId, FieldType>,
12021202
param_env: ParamEnv<'db>,
12031203
layout: &Layout,
12041204
args: GenericArgs<'db>,
@@ -1210,7 +1210,7 @@ fn render_variant_after_name<'db>(
12101210
FieldsShape::Record | FieldsShape::Tuple => {
12111211
let render_field = |f: &mut HirFormatter<'_, 'db>, id: LocalFieldId| {
12121212
let offset = layout.fields.offset(u32::from(id.into_raw()) as usize).bytes_usize();
1213-
let ty = field_types[id].get().instantiate(f.interner, args).skip_norm_wip();
1213+
let ty = field_types[id].ty().instantiate(f.interner, args).skip_norm_wip();
12141214
let Ok(layout) = f.db.layout_of_ty(ty.store(), param_env.store()) else {
12151215
return f.write_str("<layout-error>");
12161216
};

crates/hir-ty/src/drop.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ fn has_drop_glue_impl<'db>(
8383
}
8484
db.field_types(id.into())
8585
.iter()
86-
.map(|(_, field_ty)| {
86+
.map(|(_, field)| {
8787
has_drop_glue_impl(
8888
infcx,
89-
field_ty.get().instantiate(infcx.interner, subst).skip_norm_wip(),
89+
field.ty().instantiate(infcx.interner, subst).skip_norm_wip(),
9090
env,
9191
visited,
9292
)
@@ -103,13 +103,10 @@ fn has_drop_glue_impl<'db>(
103103
.map(|&(variant, _)| {
104104
db.field_types(variant.into())
105105
.iter()
106-
.map(|(_, field_ty)| {
106+
.map(|(_, field)| {
107107
has_drop_glue_impl(
108108
infcx,
109-
field_ty
110-
.get()
111-
.instantiate(infcx.interner, subst)
112-
.skip_norm_wip(),
109+
field.ty().instantiate(infcx.interner, subst).skip_norm_wip(),
113110
env,
114111
visited,
115112
)

crates/hir-ty/src/infer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2046,7 +2046,7 @@ impl<'body, 'db> InferenceContext<'body, 'db> {
20462046
.field_types(struct_id.into())
20472047
.values()
20482048
.next_back()
2049-
.map(|it| it.get())
2049+
.map(|it| it.ty())
20502050
{
20512051
Some(field) => {
20522052
ty = field.instantiate(self.interner(), substs).skip_norm_wip();

crates/hir-ty/src/infer/cast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ fn pointer_kind<'db>(
541541
let struct_data = id.fields(ctx.db);
542542
if let Some((last_field, _)) = struct_data.fields().iter().last() {
543543
let last_field_ty = ctx.db.field_types(id.into())[last_field]
544-
.get()
544+
.ty()
545545
.instantiate(ctx.interner(), subst)
546546
.skip_norm_wip();
547547
pointer_kind(expr, last_field_ty, ctx)

crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@ impl<'a, 'b, 'db, D: Delegate<'db>> ExprUseVisitor<'a, 'b, 'db, D> {
774774
with_expr.into(),
775775
with_place.clone(),
776776
adt_field_types[f_index]
777-
.get()
777+
.ty()
778778
.instantiate(self.cx.interner(), args)
779779
.skip_norm_wip(),
780780
ProjectionKind::Field {

crates/hir-ty/src/infer/expr.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,14 +1061,14 @@ impl<'db> InferenceContext<'_, 'db> {
10611061
});
10621062
}
10631063

1064-
variant_field_tys[i].get().instantiate(interner, args).skip_norm_wip()
1064+
variant_field_tys[i].ty().instantiate(interner, args).skip_norm_wip()
10651065
} else {
10661066
if let Some(field_idx) = seen_fields.get(&name) {
10671067
self.push_diagnostic(InferenceDiagnostic::DuplicateField {
10681068
field: field.expr.into(),
10691069
variant,
10701070
});
1071-
variant_field_tys[*field_idx].get().instantiate(interner, args).skip_norm_wip()
1071+
variant_field_tys[*field_idx].ty().instantiate(interner, args).skip_norm_wip()
10721072
} else {
10731073
self.push_diagnostic(InferenceDiagnostic::NoSuchField {
10741074
field: field.expr.into(),
@@ -1124,12 +1124,12 @@ impl<'db> InferenceContext<'_, 'db> {
11241124
// type we expect from the expectation value.
11251125
for (field_idx, field) in variant_fields.fields().iter() {
11261126
let fru_ty = variant_field_tys[field_idx]
1127-
.get()
1127+
.ty()
11281128
.instantiate(interner, fresh_args)
11291129
.skip_norm_wip();
11301130
if remaining_fields.remove(&field.name).is_some() {
11311131
let target_ty = variant_field_tys[field_idx]
1132-
.get()
1132+
.ty()
11331133
.instantiate(interner, args)
11341134
.skip_norm_wip();
11351135
let cause = ObligationCause::new(expr);
@@ -1684,7 +1684,7 @@ impl<'db> InferenceContext<'_, 'db> {
16841684
return None;
16851685
}
16861686
let ty = self.db.field_types(field_id.parent)[field_id.local_id]
1687-
.get()
1687+
.ty()
16881688
.instantiate(interner, parameters)
16891689
.skip_norm_wip();
16901690
Some((Either::Left(field_id), ty))
@@ -1703,7 +1703,7 @@ impl<'db> InferenceContext<'_, 'db> {
17031703
let adjustments =
17041704
self.table.register_infer_ok(autoderef.adjust_steps_as_infer_ok());
17051705
let ty = self.db.field_types(field_id.parent)[field_id.local_id]
1706-
.get()
1706+
.ty()
17071707
.instantiate(self.interner(), subst)
17081708
.skip_norm_wip();
17091709
let ty = self.process_remote_user_written_ty(ty);

crates/hir-ty/src/infer/pat.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,7 +1074,7 @@ impl<'a, 'db> InferenceContext<'a, 'db> {
10741074
for (i, &subpat) in subpats.iter().enumerate_and_adjust(variant_fields.len(), ddpos) {
10751075
let field_id = LocalFieldId::from_raw(la_arena::RawIdx::from_u32(i as u32));
10761076
let field_ty =
1077-
variant_field_tys[field_id].get().instantiate(interner, args).skip_norm_wip();
1077+
variant_field_tys[field_id].ty().instantiate(interner, args).skip_norm_wip();
10781078
self.infer_pat(subpat, field_ty, pat_info);
10791079
}
10801080
if let Err(()) = had_err {
@@ -1093,7 +1093,7 @@ impl<'a, 'db> InferenceContext<'a, 'db> {
10931093
for (i, &pat) in subpats.iter().enumerate() {
10941094
let field_id = LocalFieldId::from_raw(la_arena::RawIdx::from_u32(i as u32));
10951095
let expected = match variant_field_tys.get(field_id) {
1096-
Some(field_ty) => field_ty.get().instantiate(interner, args).skip_norm_wip(),
1096+
Some(field_ty) => field_ty.ty().instantiate(interner, args).skip_norm_wip(),
10971097
None => self.types.types.error,
10981098
};
10991099
self.infer_pat(pat, expected, pat_info);
@@ -1208,7 +1208,7 @@ impl<'a, 'db> InferenceContext<'a, 'db> {
12081208
});
12091209
}
12101210

1211-
variant_field_tys[field_idx].get().instantiate(interner, args).skip_norm_wip()
1211+
variant_field_tys[field_idx].ty().instantiate(interner, args).skip_norm_wip()
12121212
}
12131213
None => {
12141214
inexistent_fields.push(field);

0 commit comments

Comments
 (0)