Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/lib.rs')
-rw-r--r--crates/hir-ty/src/lib.rs57
1 files changed, 34 insertions, 23 deletions
diff --git a/crates/hir-ty/src/lib.rs b/crates/hir-ty/src/lib.rs
index 2e59a488e6..281cf6b2d4 100644
--- a/crates/hir-ty/src/lib.rs
+++ b/crates/hir-ty/src/lib.rs
@@ -72,7 +72,10 @@ use intern::{Symbol, sym};
use la_arena::{Arena, Idx};
use mir::{MirEvalError, VTableMap};
use rustc_hash::{FxBuildHasher, FxHashMap, FxHashSet};
-use rustc_type_ir::inherent::SliceLike;
+use rustc_type_ir::{
+ UpcastFrom,
+ inherent::{SliceLike, Ty as _},
+};
use syntax::ast::{ConstArg, make};
use traits::FnTrait;
use triomphe::Arc;
@@ -85,7 +88,7 @@ use crate::{
infer::unify::InferenceTable,
next_solver::{
DbInterner,
- mapping::{ChalkToNextSolver, convert_ty_for_result},
+ mapping::{ChalkToNextSolver, NextSolverToChalk, convert_ty_for_result},
},
};
@@ -554,8 +557,10 @@ impl CallableSig {
pub fn from_def(db: &dyn HirDatabase, def: FnDefId, substs: &Substitution) -> CallableSig {
let callable_def = ToChalk::from_chalk(db, def);
+ let interner = DbInterner::new_with(db, None, None);
+ let args: crate::next_solver::GenericArgs<'_> = substs.to_nextsolver(interner);
let sig = db.callable_item_signature(callable_def);
- sig.substitute(Interner, substs)
+ sig.instantiate(interner, args).skip_binder().to_chalk(interner)
}
pub fn from_fn_ptr(fn_ptr: &FnPointer) -> CallableSig {
CallableSig {
@@ -916,10 +921,10 @@ where
Canonical { value, binders: chalk_ir::CanonicalVarKinds::from_iter(Interner, kinds) }
}
-pub fn callable_sig_from_fn_trait(
+pub fn callable_sig_from_fn_trait<'db>(
self_ty: &Ty,
- trait_env: Arc<TraitEnvironment>,
- db: &dyn HirDatabase,
+ trait_env: Arc<TraitEnvironment<'db>>,
+ db: &'db dyn HirDatabase,
) -> Option<(FnTrait, CallableSig)> {
let krate = trait_env.krate;
let fn_once_trait = FnTrait::FnOnce.get_id(db, krate)?;
@@ -936,26 +941,32 @@ pub fn callable_sig_from_fn_trait(
// Register two obligations:
// - Self: FnOnce<?args_ty>
// - <Self as FnOnce<?args_ty>>::Output == ?ret_ty
- let args_ty = table.new_type_var();
- let mut trait_ref = b.push(self_ty.clone()).push(args_ty.clone()).build();
- let projection = TyBuilder::assoc_type_projection(
- db,
- output_assoc_type,
- Some(trait_ref.substitution.clone()),
- )
- .build();
-
- let goal: Goal = trait_ref.clone().cast(Interner);
- let pred = goal.to_nextsolver(table.interner);
- if !table.try_obligation(goal).no_solution() {
+ let args_ty = table.next_ty_var();
+ let args = [self_ty.to_nextsolver(table.interner), args_ty];
+ let trait_ref = crate::next_solver::TraitRef::new(table.interner, fn_once_trait.into(), args);
+ let projection = crate::next_solver::Ty::new_alias(
+ table.interner,
+ rustc_type_ir::AliasTyKind::Projection,
+ crate::next_solver::AliasTy::new(table.interner, output_assoc_type.into(), args),
+ );
+
+ let pred = crate::next_solver::Predicate::upcast_from(trait_ref, table.interner);
+ if !table.try_obligation(pred).no_solution() {
table.register_obligation(pred);
- let return_ty = table.normalize_projection_ty(projection);
+ let return_ty = table.normalize_alias_ty(projection);
for fn_x in [FnTrait::Fn, FnTrait::FnMut, FnTrait::FnOnce] {
let fn_x_trait = fn_x.get_id(db, krate)?;
- trait_ref.trait_id = to_chalk_trait_id(fn_x_trait);
- if !table.try_obligation(trait_ref.clone().cast(Interner)).no_solution() {
- let ret_ty = table.resolve_completely(return_ty);
- let args_ty = table.resolve_completely(args_ty);
+ let trait_ref =
+ crate::next_solver::TraitRef::new(table.interner, fn_x_trait.into(), args);
+ if !table
+ .try_obligation(crate::next_solver::Predicate::upcast_from(
+ trait_ref,
+ table.interner,
+ ))
+ .no_solution()
+ {
+ let ret_ty = table.resolve_completely(return_ty.to_chalk(table.interner));
+ let args_ty = table.resolve_completely(args_ty.to_chalk(table.interner));
let params = args_ty
.as_tuple()?
.iter(Interner)