Skip to content

Commit 84e87d5

Browse files
authored
Merge pull request #20738 from jackh726/next-trait-solver-next4
Remove non-ns version of impl_self_ty and impl_trait
2 parents 7ae5f2d + 6a45888 commit 84e87d5

File tree

17 files changed

+97
-127
lines changed

17 files changed

+97
-127
lines changed

crates/hir-ty/src/builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,6 @@ impl<'db> TyBuilder<EarlyBinder<'db, crate::next_solver::Ty<'db>>> {
378378
db: &'db dyn HirDatabase,
379379
def: hir_def::ImplId,
380380
) -> TyBuilder<EarlyBinder<'db, crate::next_solver::Ty<'db>>> {
381-
TyBuilder::subst_for_def(db, def, None).with_data(db.impl_self_ty_ns(def))
381+
TyBuilder::subst_for_def(db, def, None).with_data(db.impl_self_ty(def))
382382
}
383383
}

crates/hir-ty/src/db.rs

Lines changed: 12 additions & 20 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, Substitution, TraitEnvironment,
20-
TraitRef, Ty, TyDefId, ValueTyDefId, chalk_db,
19+
Binders, Const, ImplTraitId, ImplTraits, InferenceResult, Substitution, TraitEnvironment, Ty,
20+
TyDefId, ValueTyDefId, chalk_db,
2121
consteval::ConstEvalError,
2222
drop::DropGlue,
2323
dyn_compatibility::DynCompatibilityViolation,
@@ -143,9 +143,12 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
143143
def: ImplId,
144144
) -> (crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>, Diagnostics);
145145

146-
#[salsa::invoke(crate::lower::impl_self_ty_query)]
146+
#[salsa::invoke(crate::lower_nextsolver::impl_self_ty_query)]
147147
#[salsa::transparent]
148-
fn impl_self_ty(&self, def: ImplId) -> Binders<Ty>;
148+
fn impl_self_ty<'db>(
149+
&'db self,
150+
def: ImplId,
151+
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>;
149152

150153
// FIXME: Make this a non-interned query.
151154
#[salsa::invoke_interned(crate::lower_nextsolver::const_param_ty_with_diagnostics_query)]
@@ -169,9 +172,12 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
169172
Diagnostics,
170173
)>;
171174

172-
#[salsa::invoke(crate::lower::impl_trait_query)]
175+
#[salsa::invoke(crate::lower_nextsolver::impl_trait_query)]
173176
#[salsa::transparent]
174-
fn impl_trait(&self, def: ImplId) -> Option<Binders<TraitRef>>;
177+
fn impl_trait<'db>(
178+
&'db self,
179+
def: ImplId,
180+
) -> Option<crate::next_solver::EarlyBinder<'db, crate::next_solver::TraitRef<'db>>>;
175181

176182
#[salsa::invoke(crate::lower_nextsolver::field_types_with_diagnostics_query)]
177183
fn field_types_with_diagnostics<'db>(
@@ -325,24 +331,10 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
325331

326332
// next trait solver
327333

328-
#[salsa::invoke(crate::lower_nextsolver::impl_self_ty_query)]
329-
#[salsa::transparent]
330-
fn impl_self_ty_ns<'db>(
331-
&'db self,
332-
def: ImplId,
333-
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>;
334-
335334
#[salsa::invoke(crate::lower_nextsolver::const_param_ty_query)]
336335
#[salsa::transparent]
337336
fn const_param_ty_ns<'db>(&'db self, def: ConstParamId) -> crate::next_solver::Ty<'db>;
338337

339-
#[salsa::invoke(crate::lower_nextsolver::impl_trait_query)]
340-
#[salsa::transparent]
341-
fn impl_trait_ns<'db>(
342-
&'db self,
343-
def: ImplId,
344-
) -> Option<crate::next_solver::EarlyBinder<'db, crate::next_solver::TraitRef<'db>>>;
345-
346338
#[salsa::invoke(crate::lower_nextsolver::field_types_query)]
347339
#[salsa::transparent]
348340
fn field_types_ns<'db>(

crates/hir-ty/src/infer.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1864,7 +1864,9 @@ impl<'db> InferenceContext<'db> {
18641864
TypeNs::SelfType(impl_id) => {
18651865
let generics = crate::generics::generics(self.db, impl_id.into());
18661866
let substs = generics.placeholder_subst(self.db);
1867-
let mut ty = self.db.impl_self_ty(impl_id).substitute(Interner, &substs);
1867+
let args: crate::next_solver::GenericArgs<'_> = substs.to_nextsolver(interner);
1868+
let mut ty =
1869+
self.db.impl_self_ty(impl_id).instantiate(interner, args).to_chalk(interner);
18681870

18691871
let Some(remaining_idx) = unresolved else {
18701872
drop(ctx);

crates/hir-ty/src/infer/path.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,11 @@ impl<'db> InferenceContext<'db> {
7474
}
7575
ValueNs::ImplSelf(impl_id) => {
7676
let generics = crate::generics::generics(self.db, impl_id.into());
77+
let interner = DbInterner::new_with(self.db, None, None);
7778
let substs = generics.placeholder_subst(self.db);
78-
let ty = self.db.impl_self_ty(impl_id).substitute(Interner, &substs);
79+
let args: crate::next_solver::GenericArgs<'_> = substs.to_nextsolver(interner);
80+
let ty =
81+
self.db.impl_self_ty(impl_id).instantiate(interner, args).to_chalk(interner);
7982
return if let Some((AdtId::StructId(struct_id), substs)) = ty.as_adt() {
8083
Some(ValuePathResolution::GenericDef(
8184
struct_id.into(),
@@ -359,10 +362,13 @@ impl<'db> InferenceContext<'db> {
359362
};
360363
let substs = match container {
361364
ItemContainerId::ImplId(impl_id) => {
365+
let interner = DbInterner::new_with(self.db, None, None);
362366
let impl_substs = TyBuilder::subst_for_def(self.db, impl_id, None)
363367
.fill_with_inference_vars(&mut self.table)
364368
.build();
365-
let impl_self_ty = self.db.impl_self_ty(impl_id).substitute(Interner, &impl_substs);
369+
let args: crate::next_solver::GenericArgs<'_> = impl_substs.to_nextsolver(interner);
370+
let impl_self_ty =
371+
self.db.impl_self_ty(impl_id).instantiate(interner, args).to_chalk(interner);
366372
self.unify(&impl_self_ty, &ty);
367373
impl_substs
368374
}

crates/hir-ty/src/lower.rs

Lines changed: 12 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use chalk_ir::{
2525
use either::Either;
2626
use hir_def::{
2727
AdtId, AssocItemId, ConstId, ConstParamId, EnumId, EnumVariantId, FunctionId, GenericDefId,
28-
GenericParamId, ImplId, ItemContainerId, LocalFieldId, Lookup, StaticId, StructId, TypeAliasId,
28+
GenericParamId, ItemContainerId, LocalFieldId, Lookup, StaticId, StructId, TypeAliasId,
2929
TypeOrConstParamId, UnionId, VariantId,
3030
builtin_type::BuiltinType,
3131
expr_store::{ExpressionStore, path::Path},
@@ -34,8 +34,8 @@ use hir_def::{
3434
resolver::{HasResolver, LifetimeNs, Resolver, TypeNs},
3535
signatures::{FunctionSignature, TraitFlags},
3636
type_ref::{
37-
ConstRef, LifetimeRefId, LiteralConstRef, PathId, TraitBoundModifier,
38-
TraitRef as HirTraitRef, TypeBound, TypeRef, TypeRefId,
37+
ConstRef, LifetimeRefId, LiteralConstRef, PathId, TraitBoundModifier, TypeBound, TypeRef,
38+
TypeRefId,
3939
},
4040
};
4141
use hir_expand::name::Name;
@@ -59,6 +59,10 @@ use crate::{
5959
},
6060
make_binders,
6161
mapping::{from_chalk_trait_id, lt_to_placeholder_idx},
62+
next_solver::{
63+
DbInterner,
64+
mapping::{ChalkToNextSolver, NextSolverToChalk},
65+
},
6266
static_lifetime, to_chalk_trait_id, to_placeholder_idx,
6367
utils::all_super_trait_refs,
6468
variable_kinds_from_iter,
@@ -565,14 +569,6 @@ impl<'a> TyLoweringContext<'a> {
565569
Some((ctx.lower_trait_ref_from_resolved_path(resolved, explicit_self_ty, false), ctx))
566570
}
567571

568-
fn lower_trait_ref(
569-
&mut self,
570-
trait_ref: &HirTraitRef,
571-
explicit_self_ty: Ty,
572-
) -> Option<TraitRef> {
573-
self.lower_trait_ref_from_path(trait_ref.path, explicit_self_ty).map(|it| it.0)
574-
}
575-
576572
/// When lowering predicates from parents (impl, traits) for children defs (fns, consts, types), `generics` should
577573
/// contain the `Generics` for the **child**, while `predicate_owner` should contain the `GenericDefId` of the
578574
/// **parent**. This is important so we generate the correct bound var/placeholder.
@@ -851,21 +847,21 @@ fn named_associated_type_shorthand_candidates<R>(
851847
})
852848
};
853849

850+
let interner = DbInterner::new_with(db, None, None);
854851
match res {
855852
TypeNs::SelfType(impl_id) => {
856-
// we're _in_ the impl -- the binders get added back later. Correct,
857-
// but it would be nice to make this more explicit
858-
let trait_ref = db.impl_trait(impl_id)?.into_value_and_skipped_binders().0;
853+
let trait_ref = db.impl_trait(impl_id)?;
859854

860855
let impl_id_as_generic_def: GenericDefId = impl_id.into();
861856
if impl_id_as_generic_def != def {
862857
let subst = TyBuilder::subst_for_def(db, impl_id, None)
863858
.fill_with_bound_vars(DebruijnIndex::INNERMOST, 0)
864859
.build();
865-
let trait_ref = subst.apply(trait_ref, Interner);
860+
let args: crate::next_solver::GenericArgs<'_> = subst.to_nextsolver(interner);
861+
let trait_ref = trait_ref.instantiate(interner, args).to_chalk(interner);
866862
search(trait_ref)
867863
} else {
868-
search(trait_ref)
864+
search(trait_ref.skip_binder().to_chalk(interner))
869865
}
870866
}
871867
TypeNs::GenericParam(param_id) => {
@@ -1335,31 +1331,6 @@ impl ValueTyDefId {
13351331
}
13361332
}
13371333

1338-
pub(crate) fn impl_self_ty_query(db: &dyn HirDatabase, impl_id: ImplId) -> Binders<Ty> {
1339-
impl_self_ty_with_diagnostics_query(db, impl_id).0
1340-
}
1341-
1342-
pub(crate) fn impl_self_ty_with_diagnostics_query(
1343-
db: &dyn HirDatabase,
1344-
impl_id: ImplId,
1345-
) -> (Binders<Ty>, Diagnostics) {
1346-
let impl_data = db.impl_signature(impl_id);
1347-
let resolver = impl_id.resolver(db);
1348-
let generics = generics(db, impl_id.into());
1349-
let mut ctx = TyLoweringContext::new(
1350-
db,
1351-
&resolver,
1352-
&impl_data.store,
1353-
impl_id.into(),
1354-
LifetimeElisionKind::AnonymousCreateParameter { report_in_path: true },
1355-
)
1356-
.with_type_param_mode(ParamLoweringMode::Variable);
1357-
(
1358-
make_binders(db, &generics, ctx.lower_ty(impl_data.self_ty)),
1359-
create_diagnostics(ctx.diagnostics),
1360-
)
1361-
}
1362-
13631334
pub(crate) fn const_param_ty_query(db: &dyn HirDatabase, def: ConstParamId) -> Ty {
13641335
const_param_ty_with_diagnostics_query(db, def).0
13651336
}
@@ -1397,30 +1368,6 @@ pub(crate) fn const_param_ty_cycle_result(
13971368
TyKind::Error.intern(Interner)
13981369
}
13991370

1400-
pub(crate) fn impl_trait_query(db: &dyn HirDatabase, impl_id: ImplId) -> Option<Binders<TraitRef>> {
1401-
impl_trait_with_diagnostics_query(db, impl_id).map(|it| it.0)
1402-
}
1403-
1404-
pub(crate) fn impl_trait_with_diagnostics_query(
1405-
db: &dyn HirDatabase,
1406-
impl_id: ImplId,
1407-
) -> Option<(Binders<TraitRef>, Diagnostics)> {
1408-
let impl_data = db.impl_signature(impl_id);
1409-
let resolver = impl_id.resolver(db);
1410-
let mut ctx = TyLoweringContext::new(
1411-
db,
1412-
&resolver,
1413-
&impl_data.store,
1414-
impl_id.into(),
1415-
LifetimeElisionKind::AnonymousCreateParameter { report_in_path: true },
1416-
)
1417-
.with_type_param_mode(ParamLoweringMode::Variable);
1418-
let (self_ty, binders) = db.impl_self_ty(impl_id).into_value_and_skipped_binders();
1419-
let target_trait = impl_data.target_trait.as_ref()?;
1420-
let trait_ref = Binders::new(binders, ctx.lower_trait_ref(target_trait, self_ty)?);
1421-
Some((trait_ref, create_diagnostics(ctx.diagnostics)))
1422-
}
1423-
14241371
pub(crate) fn return_type_impl_traits(
14251372
db: &dyn HirDatabase,
14261373
def: hir_def::FunctionId,

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,15 @@ impl<'a, 'b> PathLoweringContext<'a, 'b> {
255255
// `def` can be either impl itself or item within, and we need impl itself
256256
// now.
257257
let generics = generics.parent_or_self();
258+
let interner = DbInterner::new_with(self.ctx.db, None, None);
258259
let subst = generics.placeholder_subst(self.ctx.db);
259-
self.ctx.db.impl_self_ty(impl_id).substitute(Interner, &subst)
260+
let args: crate::next_solver::GenericArgs<'_> =
261+
subst.to_nextsolver(interner);
262+
self.ctx
263+
.db
264+
.impl_self_ty(impl_id)
265+
.instantiate(interner, args)
266+
.to_chalk(interner)
260267
}
261268
ParamLoweringMode::Variable => TyBuilder::impl_self_ty(self.ctx.db, impl_id)
262269
.fill_with_bound_vars(self.ctx.in_binders, 0)

crates/hir-ty/src/lower_nextsolver.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,7 @@ pub(crate) fn impl_trait_with_diagnostics_query<'db>(
920920
impl_id.into(),
921921
LifetimeElisionKind::AnonymousCreateParameter { report_in_path: true },
922922
);
923-
let self_ty = db.impl_self_ty_ns(impl_id).skip_binder();
923+
let self_ty = db.impl_self_ty(impl_id).skip_binder();
924924
let target_trait = impl_data.target_trait.as_ref()?;
925925
let trait_ref = EarlyBinder::bind(ctx.lower_trait_ref(target_trait, self_ty)?);
926926
Some((trait_ref, create_diagnostics(ctx.diagnostics)))
@@ -2024,7 +2024,7 @@ fn named_associated_type_shorthand_candidates<'db, R>(
20242024

20252025
match res {
20262026
TypeNs::SelfType(impl_id) => {
2027-
let trait_ref = db.impl_trait_ns(impl_id)?;
2027+
let trait_ref = db.impl_trait(impl_id)?;
20282028

20292029
// FIXME(next-solver): same method in `lower` checks for impl or not
20302030
// Is that needed here?

crates/hir-ty/src/lower_nextsolver/path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ impl<'a, 'b, 'db> PathLoweringContext<'a, 'b, 'db> {
287287
}
288288
}
289289
}
290-
TypeNs::SelfType(impl_id) => self.ctx.db.impl_self_ty_ns(impl_id).skip_binder(),
290+
TypeNs::SelfType(impl_id) => self.ctx.db.impl_self_ty(impl_id).skip_binder(),
291291
TypeNs::AdtSelfType(adt) => {
292292
let args = crate::next_solver::GenericArgs::identity_for_item(
293293
self.ctx.interner,

crates/hir-ty/src/method_resolution.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -297,11 +297,12 @@ impl TraitImpls {
297297
continue;
298298
}
299299
let target_trait = match db.impl_trait(impl_id) {
300-
Some(tr) => tr.skip_binders().hir_trait_id(),
300+
Some(tr) => tr.skip_binder().def_id.0,
301301
None => continue,
302302
};
303-
let self_ty = db.impl_self_ty(impl_id);
304-
let self_ty_fp = TyFingerprint::for_trait_impl(self_ty.skip_binders());
303+
let interner = DbInterner::new_with(db, None, None);
304+
let self_ty = db.impl_self_ty(impl_id).instantiate_identity().to_chalk(interner);
305+
let self_ty_fp = TyFingerprint::for_trait_impl(&self_ty);
305306
map.entry(target_trait).or_default().entry(self_ty_fp).or_default().push(impl_id);
306307
}
307308

@@ -414,8 +415,8 @@ impl InherentImpls {
414415
continue;
415416
}
416417

417-
let self_ty = db.impl_self_ty(impl_id);
418-
let self_ty = self_ty.skip_binders();
418+
let interner = DbInterner::new_with(db, None, None);
419+
let self_ty = &db.impl_self_ty(impl_id).instantiate_identity().to_chalk(interner);
419420

420421
match is_inherent_impl_coherent(db, def_map, impl_id, self_ty) {
421422
true => {
@@ -897,10 +898,13 @@ fn find_matching_impl(
897898
table.run_in_snapshot(|table| {
898899
let impl_substs =
899900
TyBuilder::subst_for_def(db, impl_, None).fill_with_inference_vars(table).build();
901+
let args: crate::next_solver::GenericArgs<'_> =
902+
impl_substs.to_nextsolver(table.interner);
900903
let trait_ref = db
901904
.impl_trait(impl_)
902905
.expect("non-trait method in find_matching_impl")
903-
.substitute(Interner, &impl_substs);
906+
.instantiate(table.interner, args)
907+
.to_chalk(table.interner);
904908

905909
if !table.unify(&trait_ref, &actual_trait_ref) {
906910
return None;
@@ -1018,7 +1022,9 @@ pub fn check_orphan_rules(db: &dyn HirDatabase, impl_: ImplId) -> bool {
10181022
let local_crate = impl_.lookup(db).container.krate();
10191023
let is_local = |tgt_crate| tgt_crate == local_crate;
10201024

1021-
let trait_ref = impl_trait.substitute(Interner, &substs);
1025+
let interner = DbInterner::new_with(db, None, None);
1026+
let args: crate::next_solver::GenericArgs<'_> = substs.to_nextsolver(interner);
1027+
let trait_ref = impl_trait.instantiate(interner, args).to_chalk(interner);
10221028
let trait_id = from_chalk_trait_id(trait_ref.trait_id);
10231029
if is_local(trait_id.module(db).krate()) {
10241030
// trait to be implemented is local
@@ -1824,7 +1830,7 @@ fn is_valid_impl_fn_candidate(
18241830
let _p = tracing::info_span!("subst_for_def").entered();
18251831
let impl_subst = table.infer_ctxt.fresh_args_for_item(impl_id.into());
18261832
let expect_self_ty = db
1827-
.impl_self_ty_ns(impl_id)
1833+
.impl_self_ty(impl_id)
18281834
.instantiate(table.interner, &impl_subst)
18291835
.to_chalk(table.interner);
18301836

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,9 +432,12 @@ impl MirEvalError {
432432
let self_ = match func.lookup(db).container {
433433
ItemContainerId::ImplId(impl_id) => Some({
434434
let generics = crate::generics::generics(db, impl_id.into());
435+
let interner = DbInterner::new_with(db, None, None);
435436
let substs = generics.placeholder_subst(db);
437+
let args: crate::next_solver::GenericArgs<'_> =
438+
substs.to_nextsolver(interner);
436439
db.impl_self_ty(impl_id)
437-
.substitute(Interner, &substs)
440+
.instantiate(interner, args)
438441
.display(db, display_target)
439442
.to_string()
440443
}),

0 commit comments

Comments
 (0)