Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/mutability.rs')
-rw-r--r--crates/hir-ty/src/infer/mutability.rs43
1 files changed, 28 insertions, 15 deletions
diff --git a/crates/hir-ty/src/infer/mutability.rs b/crates/hir-ty/src/infer/mutability.rs
index c798e9e050..9edbc9dda0 100644
--- a/crates/hir-ty/src/infer/mutability.rs
+++ b/crates/hir-ty/src/infer/mutability.rs
@@ -1,7 +1,6 @@
//! Finds if an expression is an immutable context or a mutable context, which is used in selecting
//! between `Deref` and `DerefMut` or `Index` and `IndexMut` or similar.
-use chalk_ir::{Mutability, cast::Cast};
use hir_def::{
hir::{
Array, AsmOperand, BinaryOp, BindingAnnotation, Expr, ExprId, Pat, PatId, Statement,
@@ -11,14 +10,19 @@ use hir_def::{
};
use hir_expand::name::Name;
use intern::sym;
+use rustc_ast_ir::Mutability;
+use rustc_type_ir::inherent::IntoKind;
+use crate::next_solver::infer::traits::{Obligation, ObligationCause};
+use crate::next_solver::{GenericArgs, TraitRef};
use crate::{
- Adjust, Adjustment, AutoBorrow, Interner, OverloadedDeref, TyBuilder, TyKind,
+ Adjust, Adjustment, AutoBorrow, OverloadedDeref,
infer::{Expectation, InferenceContext, expr::ExprIsRead},
- lower::lower_to_chalk_mutability,
+ lower_nextsolver::lower_mutability,
+ next_solver::TyKind,
};
-impl InferenceContext<'_> {
+impl<'db> InferenceContext<'_, 'db> {
pub(crate) fn infer_mut_body(&mut self) {
self.infer_mut_expr(self.body.body_expr, Mutability::Not);
}
@@ -141,8 +145,8 @@ impl InferenceContext<'_> {
target,
}) = base_adjustments
{
- if let TyKind::Ref(_, _, ty) = target.kind(Interner) {
- base_ty = Some(ty.clone());
+ if let TyKind::Ref(_, ty, _) = target.kind() {
+ base_ty = Some(ty);
}
*mutability = Mutability::Mut;
}
@@ -150,15 +154,24 @@ impl InferenceContext<'_> {
// Apply `IndexMut` obligation for non-assignee expr
if let Some(base_ty) = base_ty {
let index_ty = if let Some(ty) = self.result.type_of_expr.get(index) {
- ty.clone()
+ *ty
} else {
self.infer_expr(index, &Expectation::none(), ExprIsRead::Yes)
};
- let trait_ref = TyBuilder::trait_ref(self.db, index_trait)
- .push(base_ty)
- .fill(|_| index_ty.clone().cast(Interner))
- .build();
- self.push_obligation(trait_ref.cast(Interner));
+ let trait_ref = TraitRef::new(
+ self.interner(),
+ index_trait.into(),
+ GenericArgs::new_from_iter(
+ self.interner(),
+ [base_ty.into(), index_ty.into()],
+ ),
+ );
+ self.table.register_predicate(Obligation::new(
+ self.interner(),
+ ObligationCause::new(),
+ self.table.trait_env.env,
+ trait_ref,
+ ));
}
}
self.infer_mut_expr(base, mutability);
@@ -173,8 +186,8 @@ impl InferenceContext<'_> {
{
let ty = self.result.type_of_expr.get(*expr);
let is_mut_ptr = ty.is_some_and(|ty| {
- let ty = self.table.resolve_ty_shallow(ty);
- matches!(ty.kind(Interner), chalk_ir::TyKind::Raw(Mutability::Mut, _))
+ let ty = self.table.shallow_resolve(*ty);
+ matches!(ty.kind(), TyKind::RawPtr(_, Mutability::Mut))
});
if is_mut_ptr {
mutability = Mutability::Not;
@@ -200,7 +213,7 @@ impl InferenceContext<'_> {
self.infer_mut_expr(*expr, Mutability::Not);
}
Expr::Ref { expr, rawness: _, mutability } => {
- let mutability = lower_to_chalk_mutability(*mutability);
+ let mutability = lower_mutability(*mutability);
self.infer_mut_expr(*expr, mutability);
}
Expr::BinaryOp { lhs, rhs, op: Some(BinaryOp::Assignment { .. }) } => {