Skip to content

Commit cc7c061

Browse files
committed
Use lower_nextsolver::callable_item_signature instead of lower::callable_item_signature
1 parent 73a4013 commit cc7c061

File tree

16 files changed

+188
-141
lines changed

16 files changed

+188
-141
lines changed

crates/hir-ty/src/db.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ use smallvec::SmallVec;
1616
use triomphe::Arc;
1717

1818
use crate::{
19-
Binders, Const, ImplTraitId, ImplTraits, InferenceResult, PolyFnSig, Substitution,
20-
TraitEnvironment, TraitRef, Ty, TyDefId, ValueTyDefId, chalk_db,
19+
Binders, Const, ImplTraitId, ImplTraits, InferenceResult, Substitution, TraitEnvironment,
20+
TraitRef, Ty, TyDefId, ValueTyDefId, chalk_db,
2121
consteval::ConstEvalError,
2222
drop::DropGlue,
2323
dyn_compatibility::DynCompatibilityViolation,
@@ -167,8 +167,11 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
167167
#[salsa::transparent]
168168
fn field_types(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Binders<Ty>>>;
169169

170-
#[salsa::invoke(crate::lower::callable_item_signature_query)]
171-
fn callable_item_signature(&self, def: CallableDefId) -> PolyFnSig;
170+
#[salsa::invoke(crate::lower_nextsolver::callable_item_signature_query)]
171+
fn callable_item_signature<'db>(
172+
&'db self,
173+
def: CallableDefId,
174+
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::PolyFnSig<'db>>;
172175

173176
#[salsa::invoke(crate::lower::return_type_impl_traits)]
174177
fn return_type_impl_traits(&self, def: FunctionId) -> Option<Arc<Binders<ImplTraits>>>;
@@ -354,12 +357,6 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
354357
ArenaMap<LocalFieldId, crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>>,
355358
>;
356359

357-
#[salsa::invoke(crate::lower_nextsolver::callable_item_signature_query)]
358-
fn callable_item_signature_ns<'db>(
359-
&'db self,
360-
def: CallableDefId,
361-
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::PolyFnSig<'db>>;
362-
363360
#[salsa::invoke(crate::lower_nextsolver::return_type_impl_traits)]
364361
fn return_type_impl_traits_ns<'db>(
365362
&'db self,

crates/hir-ty/src/display.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ use span::Edition;
4646
use stdx::never;
4747
use triomphe::Arc;
4848

49-
use crate::next_solver::infer::DbInternerInferExt;
5049
use crate::next_solver::infer::traits::ObligationCause;
50+
use crate::next_solver::{infer::DbInternerInferExt, mapping::NextSolverToChalk};
5151
use crate::{
5252
AliasEq, AliasTy, Binders, CallableDefId, CallableSig, ConcreteConst, Const, ConstScalar,
5353
ConstValue, DomainGoal, FnAbi, GenericArg, ImplTraitId, Interner, Lifetime, LifetimeData,
@@ -1298,7 +1298,9 @@ impl<'db> HirDisplay for crate::next_solver::Ty<'db> {
12981298
let def = def.0;
12991299
let sig = db
13001300
.callable_item_signature(def)
1301-
.substitute(Interner, &convert_args_for_result(interner, args.as_slice()));
1301+
.instantiate(interner, args)
1302+
.skip_binder()
1303+
.to_chalk(interner);
13021304

13031305
if f.display_kind.is_source_code() {
13041306
// `FnDef` is anonymous and there's no surface syntax for it. Show it as a

crates/hir-ty/src/dyn_compatibility.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ where
329329
cb(MethodViolationCode::AsyncFn)?;
330330
}
331331

332-
let sig = db.callable_item_signature_ns(func.into());
332+
let sig = db.callable_item_signature(func.into());
333333
if sig
334334
.skip_binder()
335335
.inputs()

crates/hir-ty/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,8 +578,10 @@ impl CallableSig {
578578

579579
pub fn from_def(db: &dyn HirDatabase, def: FnDefId, substs: &Substitution) -> CallableSig {
580580
let callable_def = ToChalk::from_chalk(db, def);
581+
let interner = DbInterner::new_with(db, None, None);
582+
let args: crate::next_solver::GenericArgs<'_> = substs.to_nextsolver(interner);
581583
let sig = db.callable_item_signature(callable_def);
582-
sig.substitute(Interner, substs)
584+
sig.instantiate(interner, args).skip_binder().to_chalk(interner)
583585
}
584586
pub fn from_fn_ptr(fn_ptr: &FnPointer) -> CallableSig {
585587
CallableSig {

crates/hir-ty/src/lower.rs

Lines changed: 7 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ use chalk_ir::{
2424

2525
use either::Either;
2626
use hir_def::{
27-
AdtId, AssocItemId, CallableDefId, ConstId, ConstParamId, EnumId, EnumVariantId, FunctionId,
28-
GenericDefId, GenericParamId, ImplId, ItemContainerId, LocalFieldId, Lookup, StaticId,
29-
StructId, TypeAliasId, TypeOrConstParamId, UnionId, VariantId,
27+
AdtId, AssocItemId, ConstId, ConstParamId, EnumId, EnumVariantId, FunctionId, GenericDefId,
28+
GenericParamId, ImplId, ItemContainerId, LocalFieldId, Lookup, StaticId, StructId, TypeAliasId,
29+
TypeOrConstParamId, UnionId, VariantId,
3030
builtin_type::BuiltinType,
3131
expr_store::{ExpressionStore, path::Path},
3232
hir::generics::{GenericParamDataRef, TypeOrConstParamData, WherePredicate},
@@ -45,10 +45,10 @@ use stdx::{impl_from, never};
4545
use triomphe::{Arc, ThinArc};
4646

4747
use crate::{
48-
AliasTy, Binders, BoundVar, CallableSig, Const, DebruijnIndex, DynTy, FnAbi, FnPointer, FnSig,
49-
FnSubst, ImplTrait, ImplTraitId, ImplTraits, Interner, Lifetime, LifetimeData,
50-
LifetimeOutlives, PolyFnSig, QuantifiedWhereClause, QuantifiedWhereClauses, Substitution,
51-
TraitRef, TraitRefExt, Ty, TyBuilder, TyKind, WhereClause, all_super_traits,
48+
AliasTy, Binders, BoundVar, Const, DebruijnIndex, DynTy, FnAbi, FnPointer, FnSig, FnSubst,
49+
ImplTrait, ImplTraitId, ImplTraits, Interner, Lifetime, LifetimeData, LifetimeOutlives,
50+
QuantifiedWhereClause, QuantifiedWhereClauses, Substitution, TraitRef, TraitRefExt, Ty,
51+
TyBuilder, TyKind, WhereClause, all_super_traits,
5252
consteval::{intern_const_ref, path_to_const, unknown_const, unknown_const_as_generic},
5353
db::HirDatabase,
5454
error_lifetime,
@@ -824,15 +824,6 @@ impl<'a> TyLoweringContext<'a> {
824824
}
825825
}
826826

827-
/// Build the signature of a callable item (function, struct or enum variant).
828-
pub(crate) fn callable_item_signature_query(db: &dyn HirDatabase, def: CallableDefId) -> PolyFnSig {
829-
match def {
830-
CallableDefId::FunctionId(f) => fn_sig_for_fn(db, f),
831-
CallableDefId::StructId(s) => fn_sig_for_struct_constructor(db, s),
832-
CallableDefId::EnumVariantId(e) => fn_sig_for_enum_variant_constructor(db, e),
833-
}
834-
}
835-
836827
fn named_associated_type_shorthand_candidates<R>(
837828
db: &dyn HirDatabase,
838829
// If the type parameter is defined in an impl and we're in a method, there
@@ -1312,73 +1303,6 @@ pub(crate) fn generic_defaults_with_diagnostics_cycle_result(
13121303
(GenericDefaults(None), None)
13131304
}
13141305

1315-
fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
1316-
let data = db.function_signature(def);
1317-
let resolver = def.resolver(db);
1318-
let mut ctx_params = TyLoweringContext::new(
1319-
db,
1320-
&resolver,
1321-
&data.store,
1322-
def.into(),
1323-
LifetimeElisionKind::for_fn_params(&data),
1324-
)
1325-
.with_type_param_mode(ParamLoweringMode::Variable);
1326-
let params = data.params.iter().map(|&tr| ctx_params.lower_ty(tr));
1327-
1328-
let ret = match data.ret_type {
1329-
Some(ret_type) => {
1330-
let mut ctx_ret = TyLoweringContext::new(
1331-
db,
1332-
&resolver,
1333-
&data.store,
1334-
def.into(),
1335-
LifetimeElisionKind::for_fn_ret(),
1336-
)
1337-
.with_impl_trait_mode(ImplTraitLoweringMode::Opaque)
1338-
.with_type_param_mode(ParamLoweringMode::Variable);
1339-
ctx_ret.lower_ty(ret_type)
1340-
}
1341-
None => TyKind::Tuple(0, Substitution::empty(Interner)).intern(Interner),
1342-
};
1343-
let generics = generics(db, def.into());
1344-
let sig = CallableSig::from_params_and_return(
1345-
params,
1346-
ret,
1347-
data.is_varargs(),
1348-
if data.is_unsafe() { Safety::Unsafe } else { Safety::Safe },
1349-
data.abi.as_ref().map_or(FnAbi::Rust, FnAbi::from_symbol),
1350-
);
1351-
make_binders(db, &generics, sig)
1352-
}
1353-
1354-
fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnSig {
1355-
let field_tys = db.field_types(def.into());
1356-
let params = field_tys.iter().map(|(_, ty)| ty.skip_binders().clone());
1357-
let (ret, binders) = type_for_adt(db, def.into()).into_value_and_skipped_binders();
1358-
Binders::new(
1359-
binders,
1360-
CallableSig::from_params_and_return(params, ret, false, Safety::Safe, FnAbi::RustCall),
1361-
)
1362-
}
1363-
1364-
fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -> PolyFnSig {
1365-
let field_tys = db.field_types(def.into());
1366-
let params = field_tys.iter().map(|(_, ty)| ty.skip_binders().clone());
1367-
let parent = def.lookup(db).parent;
1368-
let (ret, binders) = type_for_adt(db, parent.into()).into_value_and_skipped_binders();
1369-
Binders::new(
1370-
binders,
1371-
CallableSig::from_params_and_return(params, ret, false, Safety::Safe, FnAbi::RustCall),
1372-
)
1373-
}
1374-
1375-
fn type_for_adt(db: &dyn HirDatabase, adt: AdtId) -> Binders<Ty> {
1376-
let generics = generics(db, adt.into());
1377-
let subst = generics.bound_vars_subst(db, DebruijnIndex::INNERMOST);
1378-
let ty = TyKind::Adt(crate::AdtId(adt), subst).intern(Interner);
1379-
make_binders(db, &generics, ty)
1380-
}
1381-
13821306
pub(crate) fn type_for_type_alias_with_diagnostics_query(
13831307
db: &dyn HirDatabase,
13841308
t: TypeAliasId,

crates/hir-ty/src/method_resolution.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,9 +1746,13 @@ fn is_valid_trait_method_candidate(
17461746
.fill_with_inference_vars(table)
17471747
.build();
17481748

1749+
let args: crate::next_solver::GenericArgs<'_> =
1750+
fn_subst.to_nextsolver(table.interner);
17491751
let sig = db.callable_item_signature(fn_id.into());
1750-
let expected_receiver =
1751-
sig.map(|s| s.params()[0].clone()).substitute(Interner, &fn_subst);
1752+
let expected_receiver = sig
1753+
.map_bound(|s| s.skip_binder().inputs_and_output.as_slice()[0])
1754+
.instantiate(table.interner, args)
1755+
.to_chalk(table.interner);
17521756

17531757
// FIXME: Clean up this mess with some context struct like rustc's `ProbeContext`
17541758
let variance = match mode {
@@ -1833,9 +1837,12 @@ fn is_valid_impl_fn_candidate(
18331837
let fn_subst: crate::Substitution =
18341838
table.infer_ctxt.fresh_args_for_item(fn_id.into()).to_chalk(table.interner);
18351839

1840+
let args: crate::next_solver::GenericArgs<'_> = fn_subst.to_nextsolver(table.interner);
18361841
let sig = db.callable_item_signature(fn_id.into());
1837-
let expected_receiver =
1838-
sig.map(|s| s.params()[0].clone()).substitute(Interner, &fn_subst);
1842+
let expected_receiver = sig
1843+
.map_bound(|s| s.skip_binder().inputs_and_output.as_slice()[0])
1844+
.instantiate(table.interner, args)
1845+
.to_chalk(table.interner);
18391846

18401847
check_that!(table.unify(receiver_ty, &expected_receiver));
18411848
}

crates/hir-ty/src/mir/lower.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ use crate::{
4343
Terminator, TerminatorKind, TupleFieldId, Ty, UnOp, VariantId, intern_const_scalar,
4444
return_slot,
4545
},
46-
next_solver::{DbInterner, mapping::ChalkToNextSolver},
46+
next_solver::{
47+
DbInterner,
48+
mapping::{ChalkToNextSolver, NextSolverToChalk},
49+
},
4750
static_lifetime,
4851
traits::FnTrait,
4952
utils::ClosureSubst,
@@ -2207,8 +2210,13 @@ pub fn lower_to_mir(
22072210
// otherwise it's an inline const, and has no parameter
22082211
if let DefWithBodyId::FunctionId(fid) = owner {
22092212
let substs = TyBuilder::placeholder_subst(db, fid);
2210-
let callable_sig =
2211-
db.callable_item_signature(fid.into()).substitute(Interner, &substs);
2213+
let interner = DbInterner::new_with(db, None, None);
2214+
let args: crate::next_solver::GenericArgs<'_> = substs.to_nextsolver(interner);
2215+
let callable_sig = db
2216+
.callable_item_signature(fid.into())
2217+
.instantiate(interner, args)
2218+
.skip_binder()
2219+
.to_chalk(interner);
22122220
let mut params = callable_sig.params().iter();
22132221
let self_param = body.self_param.and_then(|id| Some((id, params.next()?.clone())));
22142222
break 'b ctx.lower_params_and_bindings(

crates/hir-ty/src/next_solver/interner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1225,7 +1225,7 @@ impl<'db> rustc_type_ir::Interner for DbInterner<'db> {
12251225
self,
12261226
def_id: Self::FunctionId,
12271227
) -> EarlyBinder<Self, rustc_type_ir::Binder<Self, rustc_type_ir::FnSig<Self>>> {
1228-
self.db().callable_item_signature_ns(def_id.0)
1228+
self.db().callable_item_signature(def_id.0)
12291229
}
12301230

12311231
fn coroutine_movability(self, def_id: Self::CoroutineId) -> rustc_ast_ir::Movability {

crates/hir-ty/src/next_solver/mapping.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,17 @@ impl<
575575
}
576576
}
577577

578+
impl<'db, T: NextSolverToChalk<'db, U>, U: HasInterner<Interner = Interner>>
579+
NextSolverToChalk<'db, chalk_ir::Binders<U>> for rustc_type_ir::Binder<DbInterner<'db>, T>
580+
{
581+
fn to_chalk(self, interner: DbInterner<'db>) -> chalk_ir::Binders<U> {
582+
chalk_ir::Binders::new(
583+
self.bound_vars().to_chalk(interner),
584+
self.skip_binder().to_chalk(interner),
585+
)
586+
}
587+
}
588+
578589
impl<'db> ChalkToNextSolver<'db, BoundVarKinds> for chalk_ir::VariableKinds<Interner> {
579590
fn to_nextsolver(&self, interner: DbInterner<'db>) -> BoundVarKinds {
580591
BoundVarKinds::new_from_iter(
@@ -584,6 +595,12 @@ impl<'db> ChalkToNextSolver<'db, BoundVarKinds> for chalk_ir::VariableKinds<Inte
584595
}
585596
}
586597

598+
impl<'db> NextSolverToChalk<'db, chalk_ir::VariableKinds<Interner>> for BoundVarKinds {
599+
fn to_chalk(self, interner: DbInterner<'db>) -> chalk_ir::VariableKinds<Interner> {
600+
chalk_ir::VariableKinds::from_iter(Interner, self.iter().map(|v| v.to_chalk(interner)))
601+
}
602+
}
603+
587604
impl<'db> ChalkToNextSolver<'db, BoundVarKind> for chalk_ir::VariableKind<Interner> {
588605
fn to_nextsolver(&self, interner: DbInterner<'db>) -> BoundVarKind {
589606
match self {
@@ -594,6 +611,18 @@ impl<'db> ChalkToNextSolver<'db, BoundVarKind> for chalk_ir::VariableKind<Intern
594611
}
595612
}
596613

614+
impl<'db> NextSolverToChalk<'db, chalk_ir::VariableKind<Interner>> for BoundVarKind {
615+
fn to_chalk(self, interner: DbInterner<'db>) -> chalk_ir::VariableKind<Interner> {
616+
match self {
617+
BoundVarKind::Ty(_) => chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General),
618+
BoundVarKind::Region(_) => chalk_ir::VariableKind::Lifetime,
619+
BoundVarKind::Const => {
620+
chalk_ir::VariableKind::Const(chalk_ir::TyKind::Error.intern(Interner))
621+
}
622+
}
623+
}
624+
}
625+
597626
impl<'db> ChalkToNextSolver<'db, GenericArg<'db>> for chalk_ir::GenericArg<Interner> {
598627
fn to_nextsolver(&self, interner: DbInterner<'db>) -> GenericArg<'db> {
599628
match self.data(Interner) {
@@ -1233,6 +1262,22 @@ where
12331262
}
12341263
}
12351264

1265+
impl<'db> NextSolverToChalk<'db, crate::CallableSig> for rustc_type_ir::FnSig<DbInterner<'db>> {
1266+
fn to_chalk(self, interner: DbInterner<'db>) -> crate::CallableSig {
1267+
crate::CallableSig {
1268+
abi: self.abi,
1269+
is_varargs: self.c_variadic,
1270+
safety: match self.safety {
1271+
super::abi::Safety::Safe => chalk_ir::Safety::Safe,
1272+
super::abi::Safety::Unsafe => chalk_ir::Safety::Unsafe,
1273+
},
1274+
params_and_return: triomphe::Arc::from_iter(
1275+
self.inputs_and_output.iter().map(|ty| convert_ty_for_result(interner, ty)),
1276+
),
1277+
}
1278+
}
1279+
}
1280+
12361281
pub fn convert_canonical_args_for_result<'db>(
12371282
interner: DbInterner<'db>,
12381283
args: Canonical<'db, Vec<GenericArg<'db>>>,

crates/hir-ty/src/tests/method_resolution.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2053,7 +2053,7 @@ impl dyn Error + Send {
20532053
// ^^^^ expected Box<dyn Error + '?>, got Box<dyn Error + Send + '?>
20542054
// FIXME, type mismatch should not occur
20552055
<dyn Error>::downcast(err).map_err(|_| loop {})
2056-
//^^^^^^^^^^^^^^^^^^^^^ type: fn downcast<{unknown}>(Box<dyn Error + 'static>) -> Result<Box<{unknown}>, Box<dyn Error + '?>>
2056+
//^^^^^^^^^^^^^^^^^^^^^ type: fn downcast<{unknown}>(Box<dyn Error + 'static>) -> Result<Box<{unknown}>, Box<dyn Error + 'static>>
20572057
}
20582058
}
20592059
"#,

0 commit comments

Comments
 (0)