Skip to content

Commit 4d4a1dd

Browse files
authored
Merge pull request #20733 from jackh726/next-trait-solver-next3
Convert more things from chalk to next solver
2 parents 905641f + 7a6df72 commit 4d4a1dd

File tree

28 files changed

+461
-528
lines changed

28 files changed

+461
-528
lines changed

crates/hir-ty/src/builder.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@
33
use chalk_ir::{
44
AdtId, DebruijnIndex, Scalar,
55
cast::{Cast, CastTo, Caster},
6-
fold::TypeFoldable,
7-
interner::HasInterner,
86
};
97
use hir_def::{GenericDefId, GenericParamId, TraitId, TypeAliasId, builtin_type::BuiltinType};
108
use smallvec::SmallVec;
119

1210
use crate::{
13-
Binders, BoundVar, CallableSig, GenericArg, GenericArgData, Interner, ProjectionTy,
14-
Substitution, TraitRef, Ty, TyDefId, TyExt, TyKind, consteval::unknown_const_as_generic,
15-
db::HirDatabase, error_lifetime, generics::generics, infer::unify::InferenceTable, primitive,
16-
to_assoc_type_id, to_chalk_trait_id,
11+
BoundVar, CallableSig, GenericArg, GenericArgData, Interner, ProjectionTy, Substitution,
12+
TraitRef, Ty, TyDefId, TyExt, TyKind,
13+
consteval::unknown_const_as_generic,
14+
db::HirDatabase,
15+
error_lifetime,
16+
generics::generics,
17+
infer::unify::InferenceTable,
18+
next_solver::{DbInterner, EarlyBinder, mapping::ChalkToNextSolver},
19+
primitive, to_assoc_type_id, to_chalk_trait_id,
1720
};
1821

1922
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -345,19 +348,20 @@ impl TyBuilder<TypeAliasId> {
345348
}
346349
}
347350

348-
impl<T: HasInterner<Interner = Interner> + TypeFoldable<Interner>> TyBuilder<Binders<T>> {
349-
pub fn build(self) -> T {
351+
impl<'db, T: rustc_type_ir::TypeFoldable<DbInterner<'db>>> TyBuilder<EarlyBinder<'db, T>> {
352+
pub fn build(self, interner: DbInterner<'db>) -> T {
350353
let (b, subst) = self.build_internal();
351-
b.substitute(Interner, &subst)
354+
let args: crate::next_solver::GenericArgs<'db> = subst.to_nextsolver(interner);
355+
b.instantiate(interner, args)
352356
}
353357
}
354358

355-
impl TyBuilder<Binders<Ty>> {
359+
impl<'db> TyBuilder<EarlyBinder<'db, crate::next_solver::Ty<'db>>> {
356360
pub fn def_ty(
357-
db: &dyn HirDatabase,
361+
db: &'db dyn HirDatabase,
358362
def: TyDefId,
359363
parent_subst: Option<Substitution>,
360-
) -> TyBuilder<Binders<Ty>> {
364+
) -> TyBuilder<EarlyBinder<'db, crate::next_solver::Ty<'db>>> {
361365
let poly_ty = db.ty(def);
362366
let id: GenericDefId = match def {
363367
TyDefId::BuiltinType(_) => {
@@ -370,7 +374,10 @@ impl TyBuilder<Binders<Ty>> {
370374
TyBuilder::subst_for_def(db, id, parent_subst).with_data(poly_ty)
371375
}
372376

373-
pub fn impl_self_ty(db: &dyn HirDatabase, def: hir_def::ImplId) -> TyBuilder<Binders<Ty>> {
374-
TyBuilder::subst_for_def(db, def, None).with_data(db.impl_self_ty(def))
377+
pub fn impl_self_ty(
378+
db: &'db dyn HirDatabase,
379+
def: hir_def::ImplId,
380+
) -> TyBuilder<EarlyBinder<'db, crate::next_solver::Ty<'db>>> {
381+
TyBuilder::subst_for_def(db, def, None).with_data(db.impl_self_ty_ns(def))
375382
}
376383
}

crates/hir-ty/src/db.rs

Lines changed: 73 additions & 105 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,
@@ -114,55 +114,88 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
114114
#[salsa::invoke(crate::dyn_compatibility::dyn_compatibility_of_trait_query)]
115115
fn dyn_compatibility_of_trait(&self, trait_: TraitId) -> Option<DynCompatibilityViolation>;
116116

117-
#[salsa::invoke(crate::lower::ty_query)]
117+
#[salsa::invoke(crate::lower_nextsolver::ty_query)]
118118
#[salsa::transparent]
119-
fn ty(&self, def: TyDefId) -> Binders<Ty>;
119+
fn ty<'db>(
120+
&'db self,
121+
def: TyDefId,
122+
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>;
120123

121-
#[salsa::invoke(crate::lower::type_for_type_alias_with_diagnostics_query)]
122-
#[salsa::cycle(cycle_result = crate::lower::type_for_type_alias_with_diagnostics_cycle_result)]
123-
fn type_for_type_alias_with_diagnostics(&self, def: TypeAliasId) -> (Binders<Ty>, Diagnostics);
124+
#[salsa::invoke(crate::lower_nextsolver::type_for_type_alias_with_diagnostics_query)]
125+
#[salsa::cycle(cycle_result = crate::lower_nextsolver::type_for_type_alias_with_diagnostics_cycle_result)]
126+
fn type_for_type_alias_with_diagnostics<'db>(
127+
&'db self,
128+
def: TypeAliasId,
129+
) -> (crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>, Diagnostics);
124130

125131
/// Returns the type of the value of the given constant, or `None` if the `ValueTyDefId` is
126132
/// a `StructId` or `EnumVariantId` with a record constructor.
127-
#[salsa::invoke(crate::lower::value_ty_query)]
128-
fn value_ty(&self, def: ValueTyDefId) -> Option<Binders<Ty>>;
133+
#[salsa::invoke(crate::lower_nextsolver::value_ty_query)]
134+
fn value_ty<'db>(
135+
&'db self,
136+
def: ValueTyDefId,
137+
) -> Option<crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>>;
129138

130-
#[salsa::invoke(crate::lower::impl_self_ty_with_diagnostics_query)]
131-
#[salsa::cycle(cycle_result = crate::lower::impl_self_ty_with_diagnostics_cycle_result)]
132-
fn impl_self_ty_with_diagnostics(&self, def: ImplId) -> (Binders<Ty>, Diagnostics);
139+
#[salsa::invoke(crate::lower_nextsolver::impl_self_ty_with_diagnostics_query)]
140+
#[salsa::cycle(cycle_result = crate::lower_nextsolver::impl_self_ty_with_diagnostics_cycle_result)]
141+
fn impl_self_ty_with_diagnostics<'db>(
142+
&'db self,
143+
def: ImplId,
144+
) -> (crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>, Diagnostics);
133145

134146
#[salsa::invoke(crate::lower::impl_self_ty_query)]
135147
#[salsa::transparent]
136148
fn impl_self_ty(&self, def: ImplId) -> Binders<Ty>;
137149

138150
// FIXME: Make this a non-interned query.
139-
#[salsa::invoke_interned(crate::lower::const_param_ty_with_diagnostics_query)]
140-
#[salsa::cycle(cycle_result = crate::lower::const_param_ty_with_diagnostics_cycle_result)]
141-
fn const_param_ty_with_diagnostics(&self, def: ConstParamId) -> (Ty, Diagnostics);
151+
#[salsa::invoke_interned(crate::lower_nextsolver::const_param_ty_with_diagnostics_query)]
152+
#[salsa::cycle(cycle_result = crate::lower_nextsolver::const_param_ty_with_diagnostics_cycle_result)]
153+
fn const_param_ty_with_diagnostics<'db>(
154+
&'db self,
155+
def: ConstParamId,
156+
) -> (crate::next_solver::Ty<'db>, Diagnostics);
142157

143-
#[salsa::invoke(crate::lower::const_param_ty_query)]
144-
#[salsa::transparent]
158+
// FIXME: Make this a non-interned query.
159+
#[salsa::invoke_interned(crate::lower::const_param_ty_query)]
160+
#[salsa::cycle(cycle_result = crate::lower::const_param_ty_cycle_result)]
145161
fn const_param_ty(&self, def: ConstParamId) -> Ty;
146162

147-
#[salsa::invoke(crate::lower::impl_trait_with_diagnostics_query)]
148-
fn impl_trait_with_diagnostics(&self, def: ImplId) -> Option<(Binders<TraitRef>, Diagnostics)>;
163+
#[salsa::invoke(crate::lower_nextsolver::impl_trait_with_diagnostics_query)]
164+
fn impl_trait_with_diagnostics<'db>(
165+
&'db self,
166+
def: ImplId,
167+
) -> Option<(
168+
crate::next_solver::EarlyBinder<'db, crate::next_solver::TraitRef<'db>>,
169+
Diagnostics,
170+
)>;
149171

150172
#[salsa::invoke(crate::lower::impl_trait_query)]
151173
#[salsa::transparent]
152174
fn impl_trait(&self, def: ImplId) -> Option<Binders<TraitRef>>;
153175

154-
#[salsa::invoke(crate::lower::field_types_with_diagnostics_query)]
155-
fn field_types_with_diagnostics(
156-
&self,
176+
#[salsa::invoke(crate::lower_nextsolver::field_types_with_diagnostics_query)]
177+
fn field_types_with_diagnostics<'db>(
178+
&'db self,
157179
var: VariantId,
158-
) -> (Arc<ArenaMap<LocalFieldId, Binders<Ty>>>, Diagnostics);
180+
) -> (
181+
Arc<
182+
ArenaMap<
183+
LocalFieldId,
184+
crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>,
185+
>,
186+
>,
187+
Diagnostics,
188+
);
159189

160190
#[salsa::invoke(crate::lower::field_types_query)]
161191
#[salsa::transparent]
162192
fn field_types(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Binders<Ty>>>;
163193

164-
#[salsa::invoke(crate::lower::callable_item_signature_query)]
165-
fn callable_item_signature(&self, def: CallableDefId) -> PolyFnSig;
194+
#[salsa::invoke(crate::lower_nextsolver::callable_item_signature_query)]
195+
fn callable_item_signature<'db>(
196+
&'db self,
197+
def: CallableDefId,
198+
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::PolyFnSig<'db>>;
166199

167200
#[salsa::invoke(crate::lower::return_type_impl_traits)]
168201
fn return_type_impl_traits(&self, def: FunctionId) -> Option<Arc<Binders<ImplTraits>>>;
@@ -182,6 +215,21 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
182215
#[salsa::invoke(crate::lower::generic_predicates_query)]
183216
fn generic_predicates(&self, def: GenericDefId) -> GenericPredicates;
184217

218+
#[salsa::invoke(
219+
crate::lower_nextsolver::generic_predicates_without_parent_with_diagnostics_query
220+
)]
221+
fn generic_predicates_without_parent_with_diagnostics<'db>(
222+
&'db self,
223+
def: GenericDefId,
224+
) -> (crate::lower_nextsolver::GenericPredicates<'db>, Diagnostics);
225+
226+
#[salsa::invoke(crate::lower_nextsolver::generic_predicates_without_parent_query)]
227+
#[salsa::transparent]
228+
fn generic_predicates_without_parent<'db>(
229+
&'db self,
230+
def: GenericDefId,
231+
) -> crate::lower_nextsolver::GenericPredicates<'db>;
232+
185233
#[salsa::invoke(crate::lower_nextsolver::trait_environment_for_body_query)]
186234
#[salsa::transparent]
187235
fn trait_environment_for_body<'db>(&'db self, def: DefWithBodyId)
@@ -277,83 +325,24 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
277325

278326
// next trait solver
279327

280-
#[salsa::invoke(crate::lower_nextsolver::ty_query)]
281-
#[salsa::transparent]
282-
fn ty_ns<'db>(
283-
&'db self,
284-
def: TyDefId,
285-
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>;
286-
287-
/// Returns the type of the value of the given constant, or `None` if the `ValueTyDefId` is
288-
/// a `StructId` or `EnumVariantId` with a record constructor.
289-
#[salsa::invoke(crate::lower_nextsolver::value_ty_query)]
290-
fn value_ty_ns<'db>(
291-
&'db self,
292-
def: ValueTyDefId,
293-
) -> Option<crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>>;
294-
295-
#[salsa::invoke(crate::lower_nextsolver::type_for_type_alias_with_diagnostics_query)]
296-
#[salsa::cycle(cycle_result = crate::lower_nextsolver::type_for_type_alias_with_diagnostics_cycle_result)]
297-
fn type_for_type_alias_with_diagnostics_ns<'db>(
298-
&'db self,
299-
def: TypeAliasId,
300-
) -> (crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>, Diagnostics);
301-
302-
#[salsa::invoke(crate::lower_nextsolver::impl_self_ty_with_diagnostics_query)]
303-
#[salsa::cycle(cycle_result = crate::lower_nextsolver::impl_self_ty_with_diagnostics_cycle_result)]
304-
fn impl_self_ty_with_diagnostics_ns<'db>(
305-
&'db self,
306-
def: ImplId,
307-
) -> (crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>, Diagnostics);
308-
309328
#[salsa::invoke(crate::lower_nextsolver::impl_self_ty_query)]
310329
#[salsa::transparent]
311330
fn impl_self_ty_ns<'db>(
312331
&'db self,
313332
def: ImplId,
314333
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>;
315334

316-
// FIXME: Make this a non-interned query.
317-
#[salsa::invoke_interned(crate::lower_nextsolver::const_param_ty_with_diagnostics_query)]
318-
fn const_param_ty_with_diagnostics_ns<'db>(
319-
&'db self,
320-
def: ConstParamId,
321-
) -> (crate::next_solver::Ty<'db>, Diagnostics);
322-
323335
#[salsa::invoke(crate::lower_nextsolver::const_param_ty_query)]
324336
#[salsa::transparent]
325337
fn const_param_ty_ns<'db>(&'db self, def: ConstParamId) -> crate::next_solver::Ty<'db>;
326338

327-
#[salsa::invoke(crate::lower_nextsolver::impl_trait_with_diagnostics_query)]
328-
fn impl_trait_with_diagnostics_ns<'db>(
329-
&'db self,
330-
def: ImplId,
331-
) -> Option<(
332-
crate::next_solver::EarlyBinder<'db, crate::next_solver::TraitRef<'db>>,
333-
Diagnostics,
334-
)>;
335-
336339
#[salsa::invoke(crate::lower_nextsolver::impl_trait_query)]
337340
#[salsa::transparent]
338341
fn impl_trait_ns<'db>(
339342
&'db self,
340343
def: ImplId,
341344
) -> Option<crate::next_solver::EarlyBinder<'db, crate::next_solver::TraitRef<'db>>>;
342345

343-
#[salsa::invoke(crate::lower_nextsolver::field_types_with_diagnostics_query)]
344-
fn field_types_with_diagnostics_ns<'db>(
345-
&'db self,
346-
var: VariantId,
347-
) -> (
348-
Arc<
349-
ArenaMap<
350-
LocalFieldId,
351-
crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>,
352-
>,
353-
>,
354-
Diagnostics,
355-
);
356-
357346
#[salsa::invoke(crate::lower_nextsolver::field_types_query)]
358347
#[salsa::transparent]
359348
fn field_types_ns<'db>(
@@ -363,12 +352,6 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
363352
ArenaMap<LocalFieldId, crate::next_solver::EarlyBinder<'db, crate::next_solver::Ty<'db>>>,
364353
>;
365354

366-
#[salsa::invoke(crate::lower_nextsolver::callable_item_signature_query)]
367-
fn callable_item_signature_ns<'db>(
368-
&'db self,
369-
def: CallableDefId,
370-
) -> crate::next_solver::EarlyBinder<'db, crate::next_solver::PolyFnSig<'db>>;
371-
372355
#[salsa::invoke(crate::lower_nextsolver::return_type_impl_traits)]
373356
fn return_type_impl_traits_ns<'db>(
374357
&'db self,
@@ -395,21 +378,6 @@ pub trait HirDatabase: DefDatabase + std::fmt::Debug {
395378
&'db self,
396379
def: GenericDefId,
397380
) -> crate::lower_nextsolver::GenericPredicates<'db>;
398-
399-
#[salsa::invoke(
400-
crate::lower_nextsolver::generic_predicates_without_parent_with_diagnostics_query
401-
)]
402-
fn generic_predicates_without_parent_with_diagnostics_ns<'db>(
403-
&'db self,
404-
def: GenericDefId,
405-
) -> (crate::lower_nextsolver::GenericPredicates<'db>, Diagnostics);
406-
407-
#[salsa::invoke(crate::lower_nextsolver::generic_predicates_without_parent_query)]
408-
#[salsa::transparent]
409-
fn generic_predicates_without_parent_ns<'db>(
410-
&'db self,
411-
def: GenericDefId,
412-
) -> crate::lower_nextsolver::GenericPredicates<'db>;
413381
}
414382

415383
#[test]

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: 2 additions & 2 deletions
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()
@@ -364,7 +364,7 @@ where
364364
cb(MethodViolationCode::UndispatchableReceiver)?;
365365
}
366366

367-
let predicates = &*db.generic_predicates_without_parent_ns(func.into());
367+
let predicates = &*db.generic_predicates_without_parent(func.into());
368368
for pred in predicates {
369369
let pred = pred.kind().skip_binder();
370370

0 commit comments

Comments
 (0)