diff options
Diffstat (limited to 'crates/hir_ty/src/traits/chalk')
-rw-r--r-- | crates/hir_ty/src/traits/chalk/mapping.rs | 435 |
1 files changed, 10 insertions, 425 deletions
diff --git a/crates/hir_ty/src/traits/chalk/mapping.rs b/crates/hir_ty/src/traits/chalk/mapping.rs index 84abd99b2..7818f6387 100644 --- a/crates/hir_ty/src/traits/chalk/mapping.rs +++ b/crates/hir_ty/src/traits/chalk/mapping.rs | |||
@@ -3,233 +3,20 @@ | |||
3 | //! Chalk (in both directions); plus some helper functions for more specialized | 3 | //! Chalk (in both directions); plus some helper functions for more specialized |
4 | //! conversions. | 4 | //! conversions. |
5 | 5 | ||
6 | use chalk_ir::{cast::Cast, interner::HasInterner}; | 6 | use chalk_ir::cast::Cast; |
7 | use chalk_solve::rust_ir; | 7 | use chalk_solve::rust_ir; |
8 | 8 | ||
9 | use base_db::salsa::InternKey; | 9 | use base_db::salsa::InternKey; |
10 | use hir_def::{GenericDefId, TypeAliasId}; | 10 | use hir_def::{GenericDefId, TypeAliasId}; |
11 | 11 | ||
12 | use crate::{ | 12 | use crate::{ |
13 | chalk_ext::ProjectionTyExt, db::HirDatabase, static_lifetime, AliasTy, CallableDefId, | 13 | db::HirDatabase, AliasTy, CallableDefId, ProjectionTyExt, QuantifiedWhereClause, Substitution, |
14 | Canonical, ConstrainedSubst, DomainGoal, FnPointer, GenericArg, InEnvironment, OpaqueTy, | 14 | Ty, WhereClause, |
15 | ProjectionTy, QuantifiedWhereClause, Substitution, TraitRef, Ty, TypeWalk, WhereClause, | ||
16 | }; | 15 | }; |
17 | 16 | ||
18 | use super::interner::*; | 17 | use super::interner::*; |
19 | use super::*; | 18 | use super::*; |
20 | 19 | ||
21 | impl ToChalk for Ty { | ||
22 | type Chalk = chalk_ir::Ty<Interner>; | ||
23 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Ty<Interner> { | ||
24 | match self.into_inner() { | ||
25 | TyKind::Ref(m, lt, ty) => { | ||
26 | chalk_ir::TyKind::Ref(m, lt, ty.to_chalk(db)).intern(&Interner) | ||
27 | } | ||
28 | TyKind::Array(ty, size) => { | ||
29 | chalk_ir::TyKind::Array(ty.to_chalk(db), size).intern(&Interner) | ||
30 | } | ||
31 | TyKind::Function(FnPointer { sig, substitution: substs, num_binders }) => { | ||
32 | let substitution = chalk_ir::FnSubst(substs.0.to_chalk(db)); | ||
33 | chalk_ir::TyKind::Function(chalk_ir::FnPointer { num_binders, sig, substitution }) | ||
34 | .intern(&Interner) | ||
35 | } | ||
36 | TyKind::AssociatedType(assoc_type_id, substs) => { | ||
37 | let substitution = substs.to_chalk(db); | ||
38 | chalk_ir::TyKind::AssociatedType(assoc_type_id, substitution).intern(&Interner) | ||
39 | } | ||
40 | |||
41 | TyKind::OpaqueType(id, substs) => { | ||
42 | let substitution = substs.to_chalk(db); | ||
43 | chalk_ir::TyKind::OpaqueType(id, substitution).intern(&Interner) | ||
44 | } | ||
45 | |||
46 | TyKind::Foreign(id) => chalk_ir::TyKind::Foreign(id).intern(&Interner), | ||
47 | |||
48 | TyKind::Scalar(scalar) => chalk_ir::TyKind::Scalar(scalar).intern(&Interner), | ||
49 | |||
50 | TyKind::Tuple(cardinality, substs) => { | ||
51 | let substitution = substs.to_chalk(db); | ||
52 | chalk_ir::TyKind::Tuple(cardinality, substitution).intern(&Interner) | ||
53 | } | ||
54 | TyKind::Raw(mutability, ty) => { | ||
55 | let ty = ty.to_chalk(db); | ||
56 | chalk_ir::TyKind::Raw(mutability, ty).intern(&Interner) | ||
57 | } | ||
58 | TyKind::Slice(ty) => chalk_ir::TyKind::Slice(ty.to_chalk(db)).intern(&Interner), | ||
59 | TyKind::Str => chalk_ir::TyKind::Str.intern(&Interner), | ||
60 | TyKind::FnDef(id, substs) => { | ||
61 | let substitution = substs.to_chalk(db); | ||
62 | chalk_ir::TyKind::FnDef(id, substitution).intern(&Interner) | ||
63 | } | ||
64 | TyKind::Never => chalk_ir::TyKind::Never.intern(&Interner), | ||
65 | |||
66 | TyKind::Closure(closure_id, substs) => { | ||
67 | let substitution = substs.to_chalk(db); | ||
68 | chalk_ir::TyKind::Closure(closure_id, substitution).intern(&Interner) | ||
69 | } | ||
70 | |||
71 | TyKind::Adt(adt_id, substs) => { | ||
72 | let substitution = substs.to_chalk(db); | ||
73 | chalk_ir::TyKind::Adt(adt_id, substitution).intern(&Interner) | ||
74 | } | ||
75 | TyKind::Alias(AliasTy::Projection(proj_ty)) => { | ||
76 | chalk_ir::AliasTy::Projection(proj_ty.to_chalk(db)) | ||
77 | .cast(&Interner) | ||
78 | .intern(&Interner) | ||
79 | } | ||
80 | TyKind::Alias(AliasTy::Opaque(opaque_ty)) => { | ||
81 | chalk_ir::AliasTy::Opaque(opaque_ty.to_chalk(db)).cast(&Interner).intern(&Interner) | ||
82 | } | ||
83 | TyKind::Placeholder(idx) => idx.to_ty::<Interner>(&Interner), | ||
84 | TyKind::BoundVar(idx) => chalk_ir::TyKind::BoundVar(idx).intern(&Interner), | ||
85 | TyKind::InferenceVar(..) => panic!("uncanonicalized infer ty"), | ||
86 | TyKind::Dyn(dyn_ty) => { | ||
87 | let (bounds, binders) = dyn_ty.bounds.into_value_and_skipped_binders(); | ||
88 | let where_clauses = chalk_ir::QuantifiedWhereClauses::from_iter( | ||
89 | &Interner, | ||
90 | bounds.interned().iter().cloned().map(|p| p.to_chalk(db)), | ||
91 | ); | ||
92 | let bounded_ty = chalk_ir::DynTy { | ||
93 | bounds: chalk_ir::Binders::new(binders, where_clauses), | ||
94 | lifetime: dyn_ty.lifetime, | ||
95 | }; | ||
96 | chalk_ir::TyKind::Dyn(bounded_ty).intern(&Interner) | ||
97 | } | ||
98 | TyKind::Error => chalk_ir::TyKind::Error.intern(&Interner), | ||
99 | } | ||
100 | } | ||
101 | fn from_chalk(db: &dyn HirDatabase, chalk: chalk_ir::Ty<Interner>) -> Self { | ||
102 | match chalk.data(&Interner).kind.clone() { | ||
103 | chalk_ir::TyKind::Error => TyKind::Error, | ||
104 | chalk_ir::TyKind::Array(ty, size) => TyKind::Array(from_chalk(db, ty), size), | ||
105 | chalk_ir::TyKind::Placeholder(idx) => TyKind::Placeholder(idx), | ||
106 | chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Projection(proj)) => { | ||
107 | TyKind::Alias(AliasTy::Projection(from_chalk(db, proj))) | ||
108 | } | ||
109 | chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Opaque(opaque_ty)) => { | ||
110 | TyKind::Alias(AliasTy::Opaque(from_chalk(db, opaque_ty))) | ||
111 | } | ||
112 | chalk_ir::TyKind::Function(chalk_ir::FnPointer { | ||
113 | num_binders, | ||
114 | sig, | ||
115 | substitution, | ||
116 | .. | ||
117 | }) => { | ||
118 | assert_eq!(num_binders, 0); | ||
119 | let substs = crate::FnSubst(from_chalk(db, substitution.0)); | ||
120 | TyKind::Function(FnPointer { num_binders, sig, substitution: substs }) | ||
121 | } | ||
122 | chalk_ir::TyKind::BoundVar(idx) => TyKind::BoundVar(idx), | ||
123 | chalk_ir::TyKind::InferenceVar(_iv, _kind) => TyKind::Error, | ||
124 | chalk_ir::TyKind::Dyn(dyn_ty) => { | ||
125 | assert_eq!(dyn_ty.bounds.binders.len(&Interner), 1); | ||
126 | let (bounds, binders) = dyn_ty.bounds.into_value_and_skipped_binders(); | ||
127 | let where_clauses = crate::QuantifiedWhereClauses::from_iter( | ||
128 | &Interner, | ||
129 | bounds.interned().iter().cloned().map(|p| from_chalk(db, p)), | ||
130 | ); | ||
131 | TyKind::Dyn(crate::DynTy { | ||
132 | bounds: crate::Binders::new(binders, where_clauses), | ||
133 | // HACK: we sometimes get lifetime variables back in solutions | ||
134 | // from Chalk, and don't have the infrastructure to substitute | ||
135 | // them yet. So for now we just turn them into 'static right | ||
136 | // when we get them | ||
137 | lifetime: static_lifetime(), | ||
138 | }) | ||
139 | } | ||
140 | |||
141 | chalk_ir::TyKind::Adt(adt_id, subst) => TyKind::Adt(adt_id, from_chalk(db, subst)), | ||
142 | chalk_ir::TyKind::AssociatedType(type_id, subst) => { | ||
143 | TyKind::AssociatedType(type_id, from_chalk(db, subst)) | ||
144 | } | ||
145 | |||
146 | chalk_ir::TyKind::OpaqueType(opaque_type_id, subst) => { | ||
147 | TyKind::OpaqueType(opaque_type_id, from_chalk(db, subst)) | ||
148 | } | ||
149 | |||
150 | chalk_ir::TyKind::Scalar(scalar) => TyKind::Scalar(scalar), | ||
151 | chalk_ir::TyKind::Tuple(cardinality, subst) => { | ||
152 | TyKind::Tuple(cardinality, from_chalk(db, subst)) | ||
153 | } | ||
154 | chalk_ir::TyKind::Raw(mutability, ty) => TyKind::Raw(mutability, from_chalk(db, ty)), | ||
155 | chalk_ir::TyKind::Slice(ty) => TyKind::Slice(from_chalk(db, ty)), | ||
156 | chalk_ir::TyKind::Ref(mutability, _lifetime, ty) => { | ||
157 | // HACK: we sometimes get lifetime variables back in solutions | ||
158 | // from Chalk, and don't have the infrastructure to substitute | ||
159 | // them yet. So for now we just turn them into 'static right | ||
160 | // when we get them | ||
161 | TyKind::Ref(mutability, static_lifetime(), from_chalk(db, ty)) | ||
162 | } | ||
163 | chalk_ir::TyKind::Str => TyKind::Str, | ||
164 | chalk_ir::TyKind::Never => TyKind::Never, | ||
165 | |||
166 | chalk_ir::TyKind::FnDef(fn_def_id, subst) => { | ||
167 | TyKind::FnDef(fn_def_id, from_chalk(db, subst)) | ||
168 | } | ||
169 | |||
170 | chalk_ir::TyKind::Closure(id, subst) => TyKind::Closure(id, from_chalk(db, subst)), | ||
171 | |||
172 | chalk_ir::TyKind::Foreign(foreign_def_id) => TyKind::Foreign(foreign_def_id), | ||
173 | chalk_ir::TyKind::Generator(_, _) => unimplemented!(), // FIXME | ||
174 | chalk_ir::TyKind::GeneratorWitness(_, _) => unimplemented!(), // FIXME | ||
175 | } | ||
176 | .intern(&Interner) | ||
177 | } | ||
178 | } | ||
179 | |||
180 | impl ToChalk for GenericArg { | ||
181 | type Chalk = chalk_ir::GenericArg<Interner>; | ||
182 | |||
183 | fn to_chalk(self, db: &dyn HirDatabase) -> Self::Chalk { | ||
184 | match self.interned() { | ||
185 | crate::GenericArgData::Ty(ty) => ty.clone().to_chalk(db).cast(&Interner), | ||
186 | } | ||
187 | } | ||
188 | |||
189 | fn from_chalk(db: &dyn HirDatabase, chalk: Self::Chalk) -> Self { | ||
190 | match chalk.interned() { | ||
191 | chalk_ir::GenericArgData::Ty(ty) => Ty::from_chalk(db, ty.clone()).cast(&Interner), | ||
192 | chalk_ir::GenericArgData::Lifetime(_) => unimplemented!(), | ||
193 | chalk_ir::GenericArgData::Const(_) => unimplemented!(), | ||
194 | } | ||
195 | } | ||
196 | } | ||
197 | |||
198 | impl ToChalk for Substitution { | ||
199 | type Chalk = chalk_ir::Substitution<Interner>; | ||
200 | |||
201 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Substitution<Interner> { | ||
202 | chalk_ir::Substitution::from_iter( | ||
203 | &Interner, | ||
204 | self.iter(&Interner).map(|ty| ty.clone().to_chalk(db)), | ||
205 | ) | ||
206 | } | ||
207 | |||
208 | fn from_chalk( | ||
209 | db: &dyn HirDatabase, | ||
210 | parameters: chalk_ir::Substitution<Interner>, | ||
211 | ) -> Substitution { | ||
212 | let tys = parameters.iter(&Interner).map(|p| from_chalk(db, p.clone())).collect(); | ||
213 | Substitution::intern(tys) | ||
214 | } | ||
215 | } | ||
216 | |||
217 | impl ToChalk for TraitRef { | ||
218 | type Chalk = chalk_ir::TraitRef<Interner>; | ||
219 | |||
220 | fn to_chalk(self: TraitRef, db: &dyn HirDatabase) -> chalk_ir::TraitRef<Interner> { | ||
221 | let trait_id = self.trait_id; | ||
222 | let substitution = self.substitution.to_chalk(db); | ||
223 | chalk_ir::TraitRef { trait_id, substitution } | ||
224 | } | ||
225 | |||
226 | fn from_chalk(db: &dyn HirDatabase, trait_ref: chalk_ir::TraitRef<Interner>) -> Self { | ||
227 | let trait_id = trait_ref.trait_id; | ||
228 | let substs = from_chalk(db, trait_ref.substitution); | ||
229 | TraitRef { trait_id, substitution: substs } | ||
230 | } | ||
231 | } | ||
232 | |||
233 | impl ToChalk for hir_def::TraitId { | 20 | impl ToChalk for hir_def::TraitId { |
234 | type Chalk = TraitId; | 21 | type Chalk = TraitId; |
235 | 22 | ||
@@ -283,208 +70,6 @@ impl ToChalk for TypeAliasAsValue { | |||
283 | } | 70 | } |
284 | } | 71 | } |
285 | 72 | ||
286 | impl ToChalk for WhereClause { | ||
287 | type Chalk = chalk_ir::WhereClause<Interner>; | ||
288 | |||
289 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::WhereClause<Interner> { | ||
290 | match self { | ||
291 | WhereClause::Implemented(trait_ref) => { | ||
292 | chalk_ir::WhereClause::Implemented(trait_ref.to_chalk(db)) | ||
293 | } | ||
294 | WhereClause::AliasEq(alias_eq) => chalk_ir::WhereClause::AliasEq(alias_eq.to_chalk(db)), | ||
295 | } | ||
296 | } | ||
297 | |||
298 | fn from_chalk( | ||
299 | db: &dyn HirDatabase, | ||
300 | where_clause: chalk_ir::WhereClause<Interner>, | ||
301 | ) -> WhereClause { | ||
302 | match where_clause { | ||
303 | chalk_ir::WhereClause::Implemented(tr) => WhereClause::Implemented(from_chalk(db, tr)), | ||
304 | chalk_ir::WhereClause::AliasEq(alias_eq) => { | ||
305 | WhereClause::AliasEq(from_chalk(db, alias_eq)) | ||
306 | } | ||
307 | |||
308 | chalk_ir::WhereClause::LifetimeOutlives(_) => { | ||
309 | // we shouldn't get these from Chalk | ||
310 | panic!("encountered LifetimeOutlives from Chalk") | ||
311 | } | ||
312 | |||
313 | chalk_ir::WhereClause::TypeOutlives(_) => { | ||
314 | // we shouldn't get these from Chalk | ||
315 | panic!("encountered TypeOutlives from Chalk") | ||
316 | } | ||
317 | } | ||
318 | } | ||
319 | } | ||
320 | |||
321 | impl ToChalk for ProjectionTy { | ||
322 | type Chalk = chalk_ir::ProjectionTy<Interner>; | ||
323 | |||
324 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::ProjectionTy<Interner> { | ||
325 | chalk_ir::ProjectionTy { | ||
326 | associated_ty_id: self.associated_ty_id, | ||
327 | substitution: self.substitution.to_chalk(db), | ||
328 | } | ||
329 | } | ||
330 | |||
331 | fn from_chalk( | ||
332 | db: &dyn HirDatabase, | ||
333 | projection_ty: chalk_ir::ProjectionTy<Interner>, | ||
334 | ) -> ProjectionTy { | ||
335 | ProjectionTy { | ||
336 | associated_ty_id: projection_ty.associated_ty_id, | ||
337 | substitution: from_chalk(db, projection_ty.substitution), | ||
338 | } | ||
339 | } | ||
340 | } | ||
341 | impl ToChalk for OpaqueTy { | ||
342 | type Chalk = chalk_ir::OpaqueTy<Interner>; | ||
343 | |||
344 | fn to_chalk(self, db: &dyn HirDatabase) -> Self::Chalk { | ||
345 | chalk_ir::OpaqueTy { | ||
346 | opaque_ty_id: self.opaque_ty_id, | ||
347 | substitution: self.substitution.to_chalk(db), | ||
348 | } | ||
349 | } | ||
350 | |||
351 | fn from_chalk(db: &dyn HirDatabase, chalk: Self::Chalk) -> Self { | ||
352 | OpaqueTy { | ||
353 | opaque_ty_id: chalk.opaque_ty_id, | ||
354 | substitution: from_chalk(db, chalk.substitution), | ||
355 | } | ||
356 | } | ||
357 | } | ||
358 | |||
359 | impl ToChalk for AliasTy { | ||
360 | type Chalk = chalk_ir::AliasTy<Interner>; | ||
361 | |||
362 | fn to_chalk(self, db: &dyn HirDatabase) -> Self::Chalk { | ||
363 | match self { | ||
364 | AliasTy::Projection(projection_ty) => { | ||
365 | chalk_ir::AliasTy::Projection(projection_ty.to_chalk(db)) | ||
366 | } | ||
367 | AliasTy::Opaque(opaque_ty) => chalk_ir::AliasTy::Opaque(opaque_ty.to_chalk(db)), | ||
368 | } | ||
369 | } | ||
370 | |||
371 | fn from_chalk(db: &dyn HirDatabase, chalk: Self::Chalk) -> Self { | ||
372 | match chalk { | ||
373 | chalk_ir::AliasTy::Projection(projection_ty) => { | ||
374 | AliasTy::Projection(from_chalk(db, projection_ty)) | ||
375 | } | ||
376 | chalk_ir::AliasTy::Opaque(opaque_ty) => AliasTy::Opaque(from_chalk(db, opaque_ty)), | ||
377 | } | ||
378 | } | ||
379 | } | ||
380 | |||
381 | impl ToChalk for AliasEq { | ||
382 | type Chalk = chalk_ir::AliasEq<Interner>; | ||
383 | |||
384 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::AliasEq<Interner> { | ||
385 | chalk_ir::AliasEq { alias: self.alias.to_chalk(db), ty: self.ty.to_chalk(db) } | ||
386 | } | ||
387 | |||
388 | fn from_chalk(db: &dyn HirDatabase, alias_eq: chalk_ir::AliasEq<Interner>) -> Self { | ||
389 | AliasEq { alias: from_chalk(db, alias_eq.alias), ty: from_chalk(db, alias_eq.ty) } | ||
390 | } | ||
391 | } | ||
392 | |||
393 | impl ToChalk for DomainGoal { | ||
394 | type Chalk = chalk_ir::DomainGoal<Interner>; | ||
395 | |||
396 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::DomainGoal<Interner> { | ||
397 | match self { | ||
398 | DomainGoal::Holds(WhereClause::Implemented(tr)) => tr.to_chalk(db).cast(&Interner), | ||
399 | DomainGoal::Holds(WhereClause::AliasEq(alias_eq)) => { | ||
400 | alias_eq.to_chalk(db).cast(&Interner) | ||
401 | } | ||
402 | } | ||
403 | } | ||
404 | |||
405 | fn from_chalk(_db: &dyn HirDatabase, _goal: chalk_ir::DomainGoal<Interner>) -> Self { | ||
406 | unimplemented!() | ||
407 | } | ||
408 | } | ||
409 | |||
410 | impl<T> ToChalk for Canonical<T> | ||
411 | where | ||
412 | T: ToChalk, | ||
413 | T::Chalk: HasInterner<Interner = Interner>, | ||
414 | { | ||
415 | type Chalk = chalk_ir::Canonical<T::Chalk>; | ||
416 | |||
417 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Canonical<T::Chalk> { | ||
418 | let value = self.value.to_chalk(db); | ||
419 | chalk_ir::Canonical { value, binders: self.binders } | ||
420 | } | ||
421 | |||
422 | fn from_chalk(db: &dyn HirDatabase, canonical: chalk_ir::Canonical<T::Chalk>) -> Canonical<T> { | ||
423 | Canonical { binders: canonical.binders, value: from_chalk(db, canonical.value) } | ||
424 | } | ||
425 | } | ||
426 | |||
427 | impl<T: ToChalk> ToChalk for InEnvironment<T> | ||
428 | where | ||
429 | T::Chalk: chalk_ir::interner::HasInterner<Interner = Interner>, | ||
430 | { | ||
431 | type Chalk = chalk_ir::InEnvironment<T::Chalk>; | ||
432 | |||
433 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::InEnvironment<T::Chalk> { | ||
434 | chalk_ir::InEnvironment { environment: self.environment, goal: self.goal.to_chalk(db) } | ||
435 | } | ||
436 | |||
437 | fn from_chalk( | ||
438 | _db: &dyn HirDatabase, | ||
439 | _in_env: chalk_ir::InEnvironment<T::Chalk>, | ||
440 | ) -> InEnvironment<T> { | ||
441 | unimplemented!() | ||
442 | } | ||
443 | } | ||
444 | |||
445 | impl<T: ToChalk> ToChalk for crate::Binders<T> | ||
446 | where | ||
447 | T::Chalk: chalk_ir::interner::HasInterner<Interner = Interner>, | ||
448 | { | ||
449 | type Chalk = chalk_ir::Binders<T::Chalk>; | ||
450 | |||
451 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Binders<T::Chalk> { | ||
452 | let (value, binders) = self.into_value_and_skipped_binders(); | ||
453 | chalk_ir::Binders::new(binders, value.to_chalk(db)) | ||
454 | } | ||
455 | |||
456 | fn from_chalk(db: &dyn HirDatabase, binders: chalk_ir::Binders<T::Chalk>) -> crate::Binders<T> { | ||
457 | let (v, b) = binders.into_value_and_skipped_binders(); | ||
458 | crate::Binders::new(b, from_chalk(db, v)) | ||
459 | } | ||
460 | } | ||
461 | |||
462 | impl ToChalk for crate::ConstrainedSubst { | ||
463 | type Chalk = chalk_ir::ConstrainedSubst<Interner>; | ||
464 | |||
465 | fn to_chalk(self, _db: &dyn HirDatabase) -> Self::Chalk { | ||
466 | unimplemented!() | ||
467 | } | ||
468 | |||
469 | fn from_chalk(db: &dyn HirDatabase, chalk: Self::Chalk) -> Self { | ||
470 | ConstrainedSubst { subst: from_chalk(db, chalk.subst) } | ||
471 | } | ||
472 | } | ||
473 | |||
474 | pub(super) fn make_binders<T>(value: T, num_vars: usize) -> chalk_ir::Binders<T> | ||
475 | where | ||
476 | T: HasInterner<Interner = Interner>, | ||
477 | { | ||
478 | chalk_ir::Binders::new( | ||
479 | chalk_ir::VariableKinds::from_iter( | ||
480 | &Interner, | ||
481 | std::iter::repeat(chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General)) | ||
482 | .take(num_vars), | ||
483 | ), | ||
484 | value, | ||
485 | ) | ||
486 | } | ||
487 | |||
488 | pub(super) fn convert_where_clauses( | 73 | pub(super) fn convert_where_clauses( |
489 | db: &dyn HirDatabase, | 74 | db: &dyn HirDatabase, |
490 | def: GenericDefId, | 75 | def: GenericDefId, |
@@ -493,7 +78,7 @@ pub(super) fn convert_where_clauses( | |||
493 | let generic_predicates = db.generic_predicates(def); | 78 | let generic_predicates = db.generic_predicates(def); |
494 | let mut result = Vec::with_capacity(generic_predicates.len()); | 79 | let mut result = Vec::with_capacity(generic_predicates.len()); |
495 | for pred in generic_predicates.iter() { | 80 | for pred in generic_predicates.iter() { |
496 | result.push(pred.clone().substitute(&Interner, substs).to_chalk(db)); | 81 | result.push(pred.clone().substitute(&Interner, substs)); |
497 | } | 82 | } |
498 | result | 83 | result |
499 | } | 84 | } |
@@ -505,33 +90,33 @@ pub(super) fn generic_predicate_to_inline_bound( | |||
505 | ) -> Option<chalk_ir::Binders<rust_ir::InlineBound<Interner>>> { | 90 | ) -> Option<chalk_ir::Binders<rust_ir::InlineBound<Interner>>> { |
506 | // An InlineBound is like a GenericPredicate, except the self type is left out. | 91 | // An InlineBound is like a GenericPredicate, except the self type is left out. |
507 | // We don't have a special type for this, but Chalk does. | 92 | // We don't have a special type for this, but Chalk does. |
508 | let self_ty_shifted_in = self_ty.clone().shifted_in_from(DebruijnIndex::ONE); | 93 | let self_ty_shifted_in = self_ty.clone().shifted_in_from(&Interner, DebruijnIndex::ONE); |
509 | let (pred, binders) = pred.as_ref().into_value_and_skipped_binders(); | 94 | let (pred, binders) = pred.as_ref().into_value_and_skipped_binders(); |
510 | match pred { | 95 | match pred { |
511 | WhereClause::Implemented(trait_ref) => { | 96 | WhereClause::Implemented(trait_ref) => { |
512 | if trait_ref.self_type_parameter(&Interner) != &self_ty_shifted_in { | 97 | if trait_ref.self_type_parameter(&Interner) != self_ty_shifted_in { |
513 | // we can only convert predicates back to type bounds if they | 98 | // we can only convert predicates back to type bounds if they |
514 | // have the expected self type | 99 | // have the expected self type |
515 | return None; | 100 | return None; |
516 | } | 101 | } |
517 | let args_no_self = trait_ref.substitution.interned()[1..] | 102 | let args_no_self = trait_ref.substitution.interned()[1..] |
518 | .iter() | 103 | .iter() |
519 | .map(|ty| ty.clone().to_chalk(db).cast(&Interner)) | 104 | .map(|ty| ty.clone().cast(&Interner)) |
520 | .collect(); | 105 | .collect(); |
521 | let trait_bound = rust_ir::TraitBound { trait_id: trait_ref.trait_id, args_no_self }; | 106 | let trait_bound = rust_ir::TraitBound { trait_id: trait_ref.trait_id, args_no_self }; |
522 | Some(chalk_ir::Binders::new(binders, rust_ir::InlineBound::TraitBound(trait_bound))) | 107 | Some(chalk_ir::Binders::new(binders, rust_ir::InlineBound::TraitBound(trait_bound))) |
523 | } | 108 | } |
524 | WhereClause::AliasEq(AliasEq { alias: AliasTy::Projection(projection_ty), ty }) => { | 109 | WhereClause::AliasEq(AliasEq { alias: AliasTy::Projection(projection_ty), ty }) => { |
525 | if projection_ty.self_type_parameter(&Interner) != &self_ty_shifted_in { | 110 | if projection_ty.self_type_parameter(&Interner) != self_ty_shifted_in { |
526 | return None; | 111 | return None; |
527 | } | 112 | } |
528 | let trait_ = projection_ty.trait_(db); | 113 | let trait_ = projection_ty.trait_(db); |
529 | let args_no_self = projection_ty.substitution.interned()[1..] | 114 | let args_no_self = projection_ty.substitution.interned()[1..] |
530 | .iter() | 115 | .iter() |
531 | .map(|ty| ty.clone().to_chalk(db).cast(&Interner)) | 116 | .map(|ty| ty.clone().cast(&Interner)) |
532 | .collect(); | 117 | .collect(); |
533 | let alias_eq_bound = rust_ir::AliasEqBound { | 118 | let alias_eq_bound = rust_ir::AliasEqBound { |
534 | value: ty.clone().to_chalk(db), | 119 | value: ty.clone(), |
535 | trait_bound: rust_ir::TraitBound { trait_id: trait_.to_chalk(db), args_no_self }, | 120 | trait_bound: rust_ir::TraitBound { trait_id: trait_.to_chalk(db), args_no_self }, |
536 | associated_ty_id: projection_ty.associated_ty_id, | 121 | associated_ty_id: projection_ty.associated_ty_id, |
537 | parameters: Vec::new(), // FIXME we don't support generic associated types yet | 122 | parameters: Vec::new(), // FIXME we don't support generic associated types yet |