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.rs | 43 |
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 { .. }) } => { |