Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/autoderef.rs')
| -rw-r--r-- | crates/hir-ty/src/infer/autoderef.rs | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/crates/hir-ty/src/infer/autoderef.rs b/crates/hir-ty/src/infer/autoderef.rs index 77b1ae6a94..1af102af23 100644 --- a/crates/hir-ty/src/infer/autoderef.rs +++ b/crates/hir-ty/src/infer/autoderef.rs @@ -2,31 +2,30 @@ use std::iter; +use rustc_ast_ir::Mutability; + use crate::{ Adjust, Adjustment, OverloadedDeref, - autoderef::{Autoderef, AutoderefKind}, + autoderef::{Autoderef, AutoderefCtx, AutoderefKind, GeneralAutoderef}, infer::unify::InferenceTable, next_solver::{ Ty, infer::{InferOk, traits::PredicateObligations}, - mapping::NextSolverToChalk, }, }; impl<'db> InferenceTable<'db> { - pub(crate) fn autoderef(&mut self, base_ty: Ty<'db>) -> Autoderef<'_, 'db> { - Autoderef::new(self, base_ty) + pub(crate) fn autoderef(&self, base_ty: Ty<'db>) -> Autoderef<'_, 'db, usize> { + Autoderef::new(&self.infer_ctxt, &self.trait_env, base_ty) } -} -impl<'db> Autoderef<'_, 'db> { - /// Returns the adjustment steps. - pub(crate) fn adjust_steps(mut self) -> Vec<Adjustment> { - let infer_ok = self.adjust_steps_as_infer_ok(); - self.table.register_infer_ok(infer_ok) + pub(crate) fn autoderef_with_tracking(&self, base_ty: Ty<'db>) -> Autoderef<'_, 'db> { + Autoderef::new_with_tracking(&self.infer_ctxt, &self.trait_env, base_ty) } +} - pub(crate) fn adjust_steps_as_infer_ok(&mut self) -> InferOk<'db, Vec<Adjustment>> { +impl<'db, Ctx: AutoderefCtx<'db>> GeneralAutoderef<'db, Ctx> { + pub(crate) fn adjust_steps_as_infer_ok(&mut self) -> InferOk<'db, Vec<Adjustment<'db>>> { let steps = self.steps(); if steps.is_empty() { return InferOk { obligations: PredicateObligations::new(), value: vec![] }; @@ -37,16 +36,13 @@ impl<'db> Autoderef<'_, 'db> { .iter() .map(|&(_source, kind)| { if let AutoderefKind::Overloaded = kind { - Some(OverloadedDeref(Some(chalk_ir::Mutability::Not))) + Some(OverloadedDeref(Some(Mutability::Not))) } else { None } }) .zip(targets) - .map(|(autoderef, target)| Adjustment { - kind: Adjust::Deref(autoderef), - target: target.to_chalk(self.table.interner), - }) + .map(|(autoderef, target)| Adjustment { kind: Adjust::Deref(autoderef), target }) .collect(); InferOk { obligations: self.take_obligations(), value: steps } |