Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions crates/hir-ty/src/builtin_derive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,11 @@ use rustc_type_ir::{
};

use crate::{
GenericPredicates,
FieldType, GenericPredicates,
db::HirDatabase,
next_solver::{
AliasTy, Clause, Clauses, DbInterner, EarlyBinder, GenericArgs, ParamEnv,
StoredEarlyBinder, StoredTy, TraitRef, Ty, TyKind, Unnormalized, fold::fold_tys,
generics::Generics,
StoredEarlyBinder, TraitRef, Ty, TyKind, Unnormalized, fold::fold_tys, generics::Generics,
},
};

Expand Down Expand Up @@ -333,7 +332,7 @@ fn simple_trait_predicates<'db>(
fn extend_assoc_type_bounds<'db>(
interner: DbInterner<'db>,
assoc_type_bounds: &mut Vec<Clause<'db>>,
fields: &ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>>,
fields: &ArenaMap<LocalFieldId, FieldType>,
trait_id: TraitId,
trait_: BuiltinDeriveImplTrait,
) {
Expand Down Expand Up @@ -365,7 +364,7 @@ fn extend_assoc_type_bounds<'db>(

let mut visitor = ProjectionFinder { interner, assoc_type_bounds, trait_id, trait_ };
for (_, field) in fields.iter() {
field.get().instantiate_identity().skip_norm_wip().visit_with(&mut visitor);
field.ty().instantiate_identity().skip_norm_wip().visit_with(&mut visitor);
}
}

Expand Down
8 changes: 4 additions & 4 deletions crates/hir-ty/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ use stdx::impl_from;
use triomphe::Arc;

use crate::{
GenericDefaultsRef, GenericPredicates, ImplTraitId, InferBodyId, TyDefId, TyLoweringResult,
ValueTyDefId,
FieldType, GenericDefaultsRef, GenericPredicates, ImplTraitId, InferBodyId, TyDefId,
TyLoweringResult, ValueTyDefId,
consteval::ConstEvalError,
dyn_compatibility::DynCompatibilityViolation,
layout::{Layout, LayoutError},
Expand Down Expand Up @@ -225,11 +225,11 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
fn field_types_with_diagnostics(
&self,
var: VariantId,
) -> &TyLoweringResult<ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>>>;
) -> &TyLoweringResult<ArenaMap<LocalFieldId, FieldType>>;

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

#[salsa::invoke(crate::lower::callable_item_signature)]
#[salsa::transparent]
Expand Down
2 changes: 1 addition & 1 deletion crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ impl<'a, 'db> MatchCheckCtx<'a, 'db> {
let fields_len = variant.fields(self.db).fields().len() as u32;

(0..fields_len).map(|idx| LocalFieldId::from_raw(idx.into())).map(move |fid| {
let ty = field_tys[fid].get().instantiate(self.infcx.interner, substs).skip_norm_wip();
let ty = field_tys[fid].ty().instantiate(self.infcx.interner, substs).skip_norm_wip();
let ty = self
.infcx
.at(&ObligationCause::dummy(), self.env)
Expand Down
10 changes: 5 additions & 5 deletions crates/hir-ty/src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ use span::Edition;
use stdx::never;

use crate::{
CallableDefId, ImplTraitId, MemoryMap, ParamEnvAndCrate, consteval,
CallableDefId, FieldType, ImplTraitId, MemoryMap, ParamEnvAndCrate, consteval,
db::{GeneralConstId, HirDatabase},
generics::{ProvenanceSplit, generics},
layout::Layout,
Expand All @@ -60,8 +60,8 @@ use crate::{
next_solver::{
AliasTy, Allocation, Clause, ClauseKind, Const, ConstKind, DbInterner,
ExistentialPredicate, FnSig, GenericArg, GenericArgKind, GenericArgs, ParamEnv, PolyFnSig,
Region, StoredEarlyBinder, StoredTy, Term, TermId, TermKind, TraitPredicate, TraitRef, Ty,
TyKind, TypingMode, Unnormalized, ValTree,
Region, Term, TermId, TermKind, TraitPredicate, TraitRef, Ty, TyKind, TypingMode,
Unnormalized, ValTree,
abi::Safety,
infer::{DbInternerInferExt, traits::ObligationCause},
},
Expand Down Expand Up @@ -1198,7 +1198,7 @@ fn render_const_scalar_from_valtree_inner<'db>(
fn render_variant_after_name<'db>(
data: &VariantFields,
f: &mut HirFormatter<'_, 'db>,
field_types: &'db ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>>,
field_types: &'db ArenaMap<LocalFieldId, FieldType>,
param_env: ParamEnv<'db>,
layout: &Layout,
args: GenericArgs<'db>,
Expand All @@ -1210,7 +1210,7 @@ fn render_variant_after_name<'db>(
FieldsShape::Record | FieldsShape::Tuple => {
let render_field = |f: &mut HirFormatter<'_, 'db>, id: LocalFieldId| {
let offset = layout.fields.offset(u32::from(id.into_raw()) as usize).bytes_usize();
let ty = field_types[id].get().instantiate(f.interner, args).skip_norm_wip();
let ty = field_types[id].ty().instantiate(f.interner, args).skip_norm_wip();
let Ok(layout) = f.db.layout_of_ty(ty.store(), param_env.store()) else {
return f.write_str("<layout-error>");
};
Expand Down
11 changes: 4 additions & 7 deletions crates/hir-ty/src/drop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,10 @@ fn has_drop_glue_impl<'db>(
}
db.field_types(id.into())
.iter()
.map(|(_, field_ty)| {
.map(|(_, field)| {
has_drop_glue_impl(
infcx,
field_ty.get().instantiate(infcx.interner, subst).skip_norm_wip(),
field.ty().instantiate(infcx.interner, subst).skip_norm_wip(),
env,
visited,
)
Expand All @@ -103,13 +103,10 @@ fn has_drop_glue_impl<'db>(
.map(|&(variant, _)| {
db.field_types(variant.into())
.iter()
.map(|(_, field_ty)| {
.map(|(_, field)| {
has_drop_glue_impl(
infcx,
field_ty
.get()
.instantiate(infcx.interner, subst)
.skip_norm_wip(),
field.ty().instantiate(infcx.interner, subst).skip_norm_wip(),
env,
visited,
)
Expand Down
2 changes: 1 addition & 1 deletion crates/hir-ty/src/infer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2046,7 +2046,7 @@ impl<'body, 'db> InferenceContext<'body, 'db> {
.field_types(struct_id.into())
.values()
.next_back()
.map(|it| it.get())
.map(|it| it.ty())
{
Some(field) => {
ty = field.instantiate(self.interner(), substs).skip_norm_wip();
Expand Down
2 changes: 1 addition & 1 deletion crates/hir-ty/src/infer/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,7 @@ fn pointer_kind<'db>(
let struct_data = id.fields(ctx.db);
if let Some((last_field, _)) = struct_data.fields().iter().last() {
let last_field_ty = ctx.db.field_types(id.into())[last_field]
.get()
.ty()
.instantiate(ctx.interner(), subst)
.skip_norm_wip();
pointer_kind(expr, last_field_ty, ctx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ impl<'a, 'b, 'db, D: Delegate<'db>> ExprUseVisitor<'a, 'b, 'db, D> {
with_expr.into(),
with_place.clone(),
adt_field_types[f_index]
.get()
.ty()
.instantiate(self.cx.interner(), args)
.skip_norm_wip(),
ProjectionKind::Field {
Expand Down
12 changes: 6 additions & 6 deletions crates/hir-ty/src/infer/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1049,14 +1049,14 @@ impl<'db> InferenceContext<'_, 'db> {
});
}

variant_field_tys[i].get().instantiate(interner, args).skip_norm_wip()
variant_field_tys[i].ty().instantiate(interner, args).skip_norm_wip()
} else {
if let Some(field_idx) = seen_fields.get(&name) {
self.push_diagnostic(InferenceDiagnostic::DuplicateField {
field: field.expr.into(),
variant,
});
variant_field_tys[*field_idx].get().instantiate(interner, args).skip_norm_wip()
variant_field_tys[*field_idx].ty().instantiate(interner, args).skip_norm_wip()
} else {
self.push_diagnostic(InferenceDiagnostic::NoSuchField {
field: field.expr.into(),
Expand Down Expand Up @@ -1112,12 +1112,12 @@ impl<'db> InferenceContext<'_, 'db> {
// type we expect from the expectation value.
for (field_idx, field) in variant_fields.fields().iter() {
let fru_ty = variant_field_tys[field_idx]
.get()
.ty()
.instantiate(interner, fresh_args)
.skip_norm_wip();
if remaining_fields.remove(&field.name).is_some() {
let target_ty = variant_field_tys[field_idx]
.get()
.ty()
.instantiate(interner, args)
.skip_norm_wip();
let cause = ObligationCause::new(expr);
Expand Down Expand Up @@ -1659,7 +1659,7 @@ impl<'db> InferenceContext<'_, 'db> {
return None;
}
let ty = self.db.field_types(field_id.parent)[field_id.local_id]
.get()
.ty()
.instantiate(interner, parameters)
.skip_norm_wip();
Some((Either::Left(field_id), ty))
Expand All @@ -1678,7 +1678,7 @@ impl<'db> InferenceContext<'_, 'db> {
let adjustments =
self.table.register_infer_ok(autoderef.adjust_steps_as_infer_ok());
let ty = self.db.field_types(field_id.parent)[field_id.local_id]
.get()
.ty()
.instantiate(self.interner(), subst)
.skip_norm_wip();
let ty = self.process_remote_user_written_ty(ty);
Expand Down
6 changes: 3 additions & 3 deletions crates/hir-ty/src/infer/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1074,7 +1074,7 @@ impl<'a, 'db> InferenceContext<'a, 'db> {
for (i, &subpat) in subpats.iter().enumerate_and_adjust(variant_fields.len(), ddpos) {
let field_id = LocalFieldId::from_raw(la_arena::RawIdx::from_u32(i as u32));
let field_ty =
variant_field_tys[field_id].get().instantiate(interner, args).skip_norm_wip();
variant_field_tys[field_id].ty().instantiate(interner, args).skip_norm_wip();
self.infer_pat(subpat, field_ty, pat_info);
}
if let Err(()) = had_err {
Expand All @@ -1093,7 +1093,7 @@ impl<'a, 'db> InferenceContext<'a, 'db> {
for (i, &pat) in subpats.iter().enumerate() {
let field_id = LocalFieldId::from_raw(la_arena::RawIdx::from_u32(i as u32));
let expected = match variant_field_tys.get(field_id) {
Some(field_ty) => field_ty.get().instantiate(interner, args).skip_norm_wip(),
Some(field_ty) => field_ty.ty().instantiate(interner, args).skip_norm_wip(),
None => self.types.types.error,
};
self.infer_pat(pat, expected, pat_info);
Expand Down Expand Up @@ -1208,7 +1208,7 @@ impl<'a, 'db> InferenceContext<'a, 'db> {
});
}

variant_field_tys[field_idx].get().instantiate(interner, args).skip_norm_wip()
variant_field_tys[field_idx].ty().instantiate(interner, args).skip_norm_wip()
}
None => {
inexistent_fields.push(field);
Expand Down
2 changes: 1 addition & 1 deletion crates/hir-ty/src/inhabitedness.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ impl<'a, 'db> UninhabitedFrom<'a, 'db> {
};

for (fid, _) in fields.iter() {
self.visit_field(field_vis.as_ref().map(|it| it[fid]), &field_tys[fid].get(), subst)?;
self.visit_field(field_vis.as_ref().map(|it| it[fid]), &field_tys[fid].ty(), subst)?;
}
CONTINUE_OPAQUELY_INHABITED
}
Expand Down
4 changes: 2 additions & 2 deletions crates/hir-ty/src/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ fn layout_of_simd_ty<'db>(
let mut fields = fields.iter();
let Some(TyKind::Array(e_ty, e_len)) =
fields.next().filter(|_| fields.next().is_none()).map(|f| {
(*f.1).get().instantiate(DbInterner::new_no_crate(db), args).skip_norm_wip().kind()
(*f.1).ty().instantiate(DbInterner::new_no_crate(db), args).skip_norm_wip().kind()
})
else {
return Err(LayoutError::InvalidSimdType);
Expand Down Expand Up @@ -567,7 +567,7 @@ fn field_ty<'a>(
fd: LocalFieldId,
args: GenericArgs<'a>,
) -> Ty<'a> {
db.field_types(def)[fd].get().instantiate(DbInterner::new_no_crate(db), args).skip_norm_wip()
db.field_types(def)[fd].ty().instantiate(DbInterner::new_no_crate(db), args).skip_norm_wip()
}

fn scalar_unit(dl: &TargetDataLayout, value: Primitive) -> Scalar {
Expand Down
6 changes: 3 additions & 3 deletions crates/hir-ty/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,9 @@ pub use infer::{
infer_query_with_inspect,
};
pub use lower::{
GenericDefaults, GenericDefaultsRef, GenericPredicates, ImplTraits, LifetimeElisionKind,
TyDefId, TyLoweringContext, TyLoweringInferVarsCtx, TyLoweringResult, ValueTyDefId,
diagnostics::*,
FieldType, GenericDefaults, GenericDefaultsRef, GenericPredicates, ImplTraits,
LifetimeElisionKind, TyDefId, TyLoweringContext, TyLoweringInferVarsCtx, TyLoweringResult,
ValueTyDefId, diagnostics::*,
};
pub use next_solver::interner::{attach_db, attach_db_allow_change, with_attached_db};
pub use target_feature::TargetFeatures;
Expand Down
42 changes: 34 additions & 8 deletions crates/hir-ty/src/lower.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,9 @@ use crate::{
AliasTy, Binder, BoundExistentialPredicates, Clause, ClauseKind, Clauses, Const, ConstKind,
DbInterner, DefaultAny, EarlyBinder, EarlyParamRegion, ErrorGuaranteed, FnSigKind,
FxIndexMap, GenericArg, GenericArgs, ParamConst, ParamEnv, PatList, Pattern, PolyFnSig,
Predicate, Region, StoredClauses, StoredEarlyBinder, StoredGenericArg, StoredGenericArgs,
StoredPolyFnSig, StoredTraitRef, StoredTy, TraitPredicate, TraitRef, Ty, Tys, Unnormalized,
abi::Safety, util::BottomUpFolder,
Predicate, Region, StoredClauses, StoredConst, StoredEarlyBinder, StoredGenericArg,
StoredGenericArgs, StoredPolyFnSig, StoredTraitRef, StoredTy, TraitPredicate, TraitRef, Ty,
Tys, Unnormalized, abi::Safety, util::BottomUpFolder,
},
};

Expand Down Expand Up @@ -1694,16 +1694,34 @@ fn const_param_types_with_diagnostics_cycle_result(
pub(crate) fn field_types_query(
db: &dyn HirDatabase,
variant_id: VariantId,
) -> &ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>> {
) -> &ArenaMap<LocalFieldId, FieldType> {
&field_types_with_diagnostics(db, variant_id).value
}

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct FieldType {
ty: StoredEarlyBinder<StoredTy>,
default: Option<StoredEarlyBinder<StoredConst>>,
}

impl FieldType {
#[inline]
pub fn ty<'db>(&self) -> EarlyBinder<'db, Ty<'db>> {
self.ty.get()
}

#[inline]
pub fn default<'db>(&self) -> Option<EarlyBinder<'db, Const<'db>>> {
self.default.as_ref().map(|default| default.get_with(|it| it.as_ref()))
}
}

/// Build the type of all specific fields of a struct or enum variant.
#[salsa::tracked(returns(ref))]
pub(crate) fn field_types_with_diagnostics(
db: &dyn HirDatabase,
variant_id: VariantId,
) -> TyLoweringResult<ArenaMap<LocalFieldId, StoredEarlyBinder<StoredTy>>> {
) -> TyLoweringResult<ArenaMap<LocalFieldId, FieldType>> {
let var_data = variant_id.fields(db);
let fields = var_data.fields();
if fields.is_empty() {
Expand All @@ -1727,7 +1745,15 @@ pub(crate) fn field_types_with_diagnostics(
LifetimeElisionKind::AnonymousReportError,
);
for (field_id, field_data) in var_data.fields().iter() {
res.insert(field_id, StoredEarlyBinder::bind(ctx.lower_ty(field_data.type_ref).store()));
let ty = ctx.lower_ty(field_data.type_ref);
let default = field_data.default_value.map(|default| ctx.lower_const(default, ty));
res.insert(
field_id,
FieldType {
ty: StoredEarlyBinder::bind(ty.store()),
default: default.map(|default| StoredEarlyBinder::bind(default.store())),
},
);
}
TyLoweringResult::from_ctx(res, ctx)
}
Expand Down Expand Up @@ -2628,7 +2654,7 @@ fn fn_sig_for_struct_constructor(
def: StructId,
) -> StoredEarlyBinder<StoredPolyFnSig> {
let field_tys = db.field_types(def.into());
let params = field_tys.iter().map(|(_, ty)| ty.get().skip_binder());
let params = field_tys.iter().map(|(_, field)| field.ty().skip_binder());
let ret = type_for_adt(db, def.into()).skip_binder();

let inputs_and_output =
Expand All @@ -2644,7 +2670,7 @@ fn fn_sig_for_enum_variant_constructor(
def: EnumVariantId,
) -> StoredEarlyBinder<StoredPolyFnSig> {
let field_tys = db.field_types(def.into());
let params = field_tys.iter().map(|(_, ty)| ty.get().skip_binder());
let params = field_tys.iter().map(|(_, field)| field.ty().skip_binder());
let parent = def.lookup(db).parent;
let ret = type_for_adt(db, parent.into()).skip_binder();

Expand Down
2 changes: 1 addition & 1 deletion crates/hir-ty/src/mir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ impl<V: PartialEq> ProjectionElem<V> {
},
ProjectionElem::Field(Either::Left(f)) => match base.kind() {
TyKind::Adt(_, subst) => db.field_types(f.parent)[f.local_id]
.get()
.ty()
.instantiate(interner, subst)
.skip_norm_wip(),
ty => {
Expand Down
Loading
Loading