Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics.rs')
| -rw-r--r-- | crates/hir/src/semantics.rs | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 5af8659ca6..45c2020bc8 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -29,6 +29,8 @@ use hir_expand::{ name::AsName, }; use hir_ty::diagnostics::{unsafe_operations, unsafe_operations_for_body}; +use hir_ty::next_solver::DbInterner; +use hir_ty::next_solver::mapping::{ChalkToNextSolver, NextSolverToChalk}; use intern::{Interned, Symbol, sym}; use itertools::Itertools; use rustc_hash::{FxHashMap, FxHashSet}; @@ -1553,19 +1555,24 @@ impl<'db> SemanticsImpl<'db> { pub fn expr_adjustments(&self, expr: &ast::Expr) -> Option<Vec<Adjustment<'db>>> { let mutability = |m| match m { - hir_ty::Mutability::Not => Mutability::Shared, - hir_ty::Mutability::Mut => Mutability::Mut, + hir_ty::next_solver::Mutability::Not => Mutability::Shared, + hir_ty::next_solver::Mutability::Mut => Mutability::Mut, }; let analyzer = self.analyze(expr.syntax())?; let (mut source_ty, _) = analyzer.type_of_expr(self.db, expr)?; + let interner = DbInterner::new_with(self.db, None, None); + analyzer.expr_adjustments(expr).map(|it| { it.iter() .map(|adjust| { - let target = - Type::new_with_resolver(self.db, &analyzer.resolver, adjust.target.clone()); + let target = Type::new_with_resolver( + self.db, + &analyzer.resolver, + adjust.target.to_chalk(interner), + ); let kind = match adjust.kind { hir_ty::Adjust::NeverToAny => Adjust::NeverToAny, hir_ty::Adjust::Deref(Some(hir_ty::OverloadedDeref(m))) => { @@ -1652,11 +1659,18 @@ impl<'db> SemanticsImpl<'db> { func: Function, subst: impl IntoIterator<Item = Type<'db>>, ) -> Option<Function> { - let mut substs = hir_ty::TyBuilder::subst_for_def(self.db, TraitId::from(trait_), None); - for s in subst { - substs = substs.push(s.ty); - } - Some(self.db.lookup_impl_method(env.env, func.into(), substs.build()).0.into()) + let interner = DbInterner::new_with(self.db, None, None); + let mut subst = subst.into_iter(); + let substs = hir_ty::next_solver::GenericArgs::for_item( + interner, + trait_.id.into(), + |_, _, id, _| { + assert!(matches!(id, hir_def::GenericParamId::TypeParamId(_)), "expected a type"); + subst.next().expect("too few subst").ty.to_nextsolver(interner).into() + }, + ); + assert!(subst.next().is_none(), "too many subst"); + Some(self.db.lookup_impl_method(env.env, func.into(), substs).0.into()) } fn resolve_range_pat(&self, range_pat: &ast::RangePat) -> Option<StructId> { |