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.rs32
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> {