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.rs47
1 files changed, 26 insertions, 21 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index c9af4aa263..27516ed80b 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -3128,7 +3128,7 @@ impl Const {
let interner = DbInterner::new_no_crate(db);
let ty = db.value_ty(self.id.into()).unwrap().instantiate_identity();
db.const_eval(self.id, GenericArgs::empty(interner), None).map(|it| EvaluatedConst {
- const_: it,
+ allocation: it,
def: self.id.into(),
ty,
})
@@ -3143,22 +3143,19 @@ impl HasVisibility for Const {
pub struct EvaluatedConst<'db> {
def: DefWithBodyId,
- const_: hir_ty::next_solver::Const<'db>,
+ allocation: hir_ty::next_solver::Allocation<'db>,
ty: Ty<'db>,
}
impl<'db> EvaluatedConst<'db> {
pub fn render(&self, db: &dyn HirDatabase, display_target: DisplayTarget) -> String {
- format!("{}", self.const_.display(db, display_target))
+ format!("{}", self.allocation.display(db, display_target))
}
pub fn render_debug(&self, db: &'db dyn HirDatabase) -> Result<String, MirEvalError> {
- let kind = self.const_.kind();
- if let ConstKind::Value(c) = kind
- && let ty = c.ty.kind()
- && let TyKind::Int(_) | TyKind::Uint(_) = ty
- {
- let b = &c.value.inner().memory;
+ let ty = self.allocation.ty.kind();
+ if let TyKind::Int(_) | TyKind::Uint(_) = ty {
+ let b = &self.allocation.memory;
let value = u128::from_le_bytes(mir::pad16(b, false));
let value_signed = i128::from_le_bytes(mir::pad16(b, matches!(ty, TyKind::Int(_))));
let mut result =
@@ -3170,7 +3167,7 @@ impl<'db> EvaluatedConst<'db> {
return Ok(result);
}
}
- mir::render_const_using_debug_impl(db, self.def, self.const_, self.ty)
+ mir::render_const_using_debug_impl(db, self.def, self.allocation, self.ty)
}
}
@@ -3211,7 +3208,7 @@ impl Static {
pub fn eval(self, db: &dyn HirDatabase) -> Result<EvaluatedConst<'_>, ConstEvalError> {
let ty = db.value_ty(self.id.into()).unwrap().instantiate_identity();
db.const_eval_static(self.id).map(|it| EvaluatedConst {
- const_: it,
+ allocation: it,
def: self.id.into(),
ty,
})
@@ -5740,8 +5737,11 @@ impl<'db> Type<'db> {
// FIXME: We don't handle GATs yet.
let projection = Ty::new_alias(
interner,
- AliasTyKind::Projection,
- AliasTy::new_from_args(interner, alias.id.into(), args),
+ AliasTy::new_from_args(
+ interner,
+ AliasTyKind::Projection { def_id: alias.id.into() },
+ args,
+ ),
);
let infcx = interner.infer_ctxt().build(TypingMode::PostAnalysis);
@@ -6357,8 +6357,12 @@ impl<'db> Type<'db> {
}
pub fn as_associated_type_parent_trait(&self, db: &'db dyn HirDatabase) -> Option<Trait> {
- let TyKind::Alias(AliasTyKind::Projection, alias) = self.ty.kind() else { return None };
- match alias.def_id.expect_type_alias().loc(db).container {
+ let TyKind::Alias(AliasTy { kind: AliasTyKind::Projection { def_id }, .. }) =
+ self.ty.kind()
+ else {
+ return None;
+ };
+ match def_id.expect_type_alias().loc(db).container {
ItemContainerId::TraitId(id) => Some(Trait { id }),
_ => None,
}
@@ -6674,8 +6678,8 @@ impl Layout {
let offset = stride.bytes() * tail;
self.0.size.bytes().checked_sub(offset)?.checked_sub(tail_field_size)
}),
- layout::FieldsShape::Arbitrary { ref offsets, ref memory_index } => {
- let tail = memory_index.last_index()?;
+ layout::FieldsShape::Arbitrary { ref offsets, ref in_memory_order } => {
+ let tail = in_memory_order[in_memory_order.len().checked_sub(1)? as u32];
let tail_field_size = field_size(tail.0.into_raw().into_u32() as usize)?;
let offset = offsets.get(tail)?.bytes();
self.0.size.bytes().checked_sub(offset)?.checked_sub(tail_field_size)
@@ -6695,10 +6699,11 @@ impl Layout {
let size = field_size(0)?;
stride.bytes().checked_sub(size)
}
- layout::FieldsShape::Arbitrary { ref offsets, ref memory_index } => {
- let mut reverse_index = vec![None; memory_index.len()];
- for (src, (mem, offset)) in memory_index.iter().zip(offsets.iter()).enumerate() {
- reverse_index[*mem as usize] = Some((src, offset.bytes()));
+ layout::FieldsShape::Arbitrary { ref offsets, ref in_memory_order } => {
+ let mut reverse_index = vec![None; in_memory_order.len()];
+ for (mem, src) in in_memory_order.iter().enumerate() {
+ reverse_index[mem] =
+ Some((src.0.into_raw().into_u32() as usize, offsets[*src].bytes()));
}
if reverse_index.iter().any(|it| it.is_none()) {
stdx::never!();