aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/traits
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/traits')
-rw-r--r--crates/hir_ty/src/traits/chalk.rs13
-rw-r--r--crates/hir_ty/src/traits/chalk/mapping.rs61
2 files changed, 18 insertions, 56 deletions
diff --git a/crates/hir_ty/src/traits/chalk.rs b/crates/hir_ty/src/traits/chalk.rs
index bb92d8e2a..1f3e1c07a 100644
--- a/crates/hir_ty/src/traits/chalk.rs
+++ b/crates/hir_ty/src/traits/chalk.rs
@@ -177,10 +177,9 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
177 } 177 }
178 178
179 fn opaque_ty_data(&self, id: chalk_ir::OpaqueTyId<Interner>) -> Arc<OpaqueTyDatum> { 179 fn opaque_ty_data(&self, id: chalk_ir::OpaqueTyId<Interner>) -> Arc<OpaqueTyDatum> {
180 let interned_id = crate::db::InternedOpaqueTyId::from(id); 180 let full_id = self.db.lookup_intern_impl_trait_id(id.into());
181 let full_id = self.db.lookup_intern_impl_trait_id(interned_id);
182 let bound = match full_id { 181 let bound = match full_id {
183 crate::OpaqueTyId::ReturnTypeImplTrait(func, idx) => { 182 crate::ImplTraitId::ReturnTypeImplTrait(func, idx) => {
184 let datas = self 183 let datas = self
185 .db 184 .db
186 .return_type_impl_traits(func) 185 .return_type_impl_traits(func)
@@ -202,7 +201,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
202 let num_vars = datas.num_binders; 201 let num_vars = datas.num_binders;
203 make_binders(bound, num_vars) 202 make_binders(bound, num_vars)
204 } 203 }
205 crate::OpaqueTyId::AsyncBlockTypeImplTrait(..) => { 204 crate::ImplTraitId::AsyncBlockTypeImplTrait(..) => {
206 if let Some((future_trait, future_output)) = self 205 if let Some((future_trait, future_output)) = self
207 .db 206 .db
208 .lang_item(self.krate, "future_trait".into()) 207 .lang_item(self.krate, "future_trait".into())
@@ -716,14 +715,14 @@ impl From<crate::db::InternedOpaqueTyId> for OpaqueTyId {
716 } 715 }
717} 716}
718 717
719impl From<chalk_ir::ClosureId<Interner>> for crate::db::ClosureId { 718impl From<chalk_ir::ClosureId<Interner>> for crate::db::InternedClosureId {
720 fn from(id: chalk_ir::ClosureId<Interner>) -> Self { 719 fn from(id: chalk_ir::ClosureId<Interner>) -> Self {
721 Self::from_intern_id(id.0) 720 Self::from_intern_id(id.0)
722 } 721 }
723} 722}
724 723
725impl From<crate::db::ClosureId> for chalk_ir::ClosureId<Interner> { 724impl From<crate::db::InternedClosureId> for chalk_ir::ClosureId<Interner> {
726 fn from(id: crate::db::ClosureId) -> Self { 725 fn from(id: crate::db::InternedClosureId) -> Self {
727 chalk_ir::ClosureId(id.as_intern_id()) 726 chalk_ir::ClosureId(id.as_intern_id())
728 } 727 }
729} 728}
diff --git a/crates/hir_ty/src/traits/chalk/mapping.rs b/crates/hir_ty/src/traits/chalk/mapping.rs
index 23ef07d77..2a66a2310 100644
--- a/crates/hir_ty/src/traits/chalk/mapping.rs
+++ b/crates/hir_ty/src/traits/chalk/mapping.rs
@@ -3,10 +3,7 @@
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
6use chalk_ir::{ 6use chalk_ir::{cast::Cast, fold::shift::Shift, interner::HasInterner, LifetimeData};
7 cast::Cast, fold::shift::Shift, interner::HasInterner, LifetimeData, PlaceholderIndex,
8 UniverseIndex,
9};
10use chalk_solve::rust_ir; 7use chalk_solve::rust_ir;
11 8
12use base_db::salsa::InternKey; 9use base_db::salsa::InternKey;
@@ -18,7 +15,7 @@ use crate::{
18 primitive::UintTy, 15 primitive::UintTy,
19 traits::{Canonical, Obligation}, 16 traits::{Canonical, Obligation},
20 AliasTy, CallableDefId, FnPointer, FnSig, GenericPredicate, InEnvironment, OpaqueTy, 17 AliasTy, CallableDefId, FnPointer, FnSig, GenericPredicate, InEnvironment, OpaqueTy,
21 OpaqueTyId, ProjectionPredicate, ProjectionTy, Scalar, Substs, TraitRef, Ty, 18 ProjectionPredicate, ProjectionTy, Scalar, Substs, TraitRef, Ty,
22}; 19};
23 20
24use super::interner::*; 21use super::interner::*;
@@ -44,8 +41,7 @@ impl ToChalk for Ty {
44 chalk_ir::TyKind::AssociatedType(assoc_type_id, substitution).intern(&Interner) 41 chalk_ir::TyKind::AssociatedType(assoc_type_id, substitution).intern(&Interner)
45 } 42 }
46 43
47 TyKind::OpaqueType(impl_trait_id, substs) => { 44 TyKind::OpaqueType(id, substs) => {
48 let id = impl_trait_id.to_chalk(db);
49 let substitution = substs.to_chalk(db); 45 let substitution = substs.to_chalk(db);
50 chalk_ir::TyKind::OpaqueType(id, substitution).intern(&Interner) 46 chalk_ir::TyKind::OpaqueType(id, substitution).intern(&Interner)
51 } 47 }
@@ -72,10 +68,9 @@ impl ToChalk for Ty {
72 } 68 }
73 TyKind::Never => chalk_ir::TyKind::Never.intern(&Interner), 69 TyKind::Never => chalk_ir::TyKind::Never.intern(&Interner),
74 70
75 TyKind::Closure(def, expr, substs) => { 71 TyKind::Closure(closure_id, substs) => {
76 let closure_id = db.intern_closure((def, expr));
77 let substitution = substs.to_chalk(db); 72 let substitution = substs.to_chalk(db);
78 chalk_ir::TyKind::Closure(closure_id.into(), substitution).intern(&Interner) 73 chalk_ir::TyKind::Closure(closure_id, substitution).intern(&Interner)
79 } 74 }
80 75
81 TyKind::Adt(adt_id, substs) => { 76 TyKind::Adt(adt_id, substs) => {
@@ -92,14 +87,7 @@ impl ToChalk for Ty {
92 .cast(&Interner) 87 .cast(&Interner)
93 .intern(&Interner) 88 .intern(&Interner)
94 } 89 }
95 TyKind::Placeholder(id) => { 90 TyKind::Placeholder(idx) => idx.to_ty::<Interner>(&Interner),
96 let interned_id = db.intern_type_param_id(id);
97 PlaceholderIndex {
98 ui: UniverseIndex::ROOT,
99 idx: interned_id.as_intern_id().as_usize(),
100 }
101 .to_ty::<Interner>(&Interner)
102 }
103 TyKind::BoundVar(idx) => chalk_ir::TyKind::BoundVar(idx).intern(&Interner), 91 TyKind::BoundVar(idx) => chalk_ir::TyKind::BoundVar(idx).intern(&Interner),
104 TyKind::InferenceVar(..) => panic!("uncanonicalized infer ty"), 92 TyKind::InferenceVar(..) => panic!("uncanonicalized infer ty"),
105 TyKind::Dyn(predicates) => { 93 TyKind::Dyn(predicates) => {
@@ -114,7 +102,7 @@ impl ToChalk for Ty {
114 chalk_ir::TyKind::Dyn(bounded_ty).intern(&Interner) 102 chalk_ir::TyKind::Dyn(bounded_ty).intern(&Interner)
115 } 103 }
116 TyKind::Alias(AliasTy::Opaque(opaque_ty)) => { 104 TyKind::Alias(AliasTy::Opaque(opaque_ty)) => {
117 let opaque_ty_id = opaque_ty.opaque_ty_id.to_chalk(db); 105 let opaque_ty_id = opaque_ty.opaque_ty_id;
118 let substitution = opaque_ty.parameters.to_chalk(db); 106 let substitution = opaque_ty.parameters.to_chalk(db);
119 chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Opaque(chalk_ir::OpaqueTy { 107 chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Opaque(chalk_ir::OpaqueTy {
120 opaque_ty_id, 108 opaque_ty_id,
@@ -129,22 +117,16 @@ impl ToChalk for Ty {
129 match chalk.data(&Interner).kind.clone() { 117 match chalk.data(&Interner).kind.clone() {
130 chalk_ir::TyKind::Error => TyKind::Unknown, 118 chalk_ir::TyKind::Error => TyKind::Unknown,
131 chalk_ir::TyKind::Array(ty, _size) => TyKind::Array(Substs::single(from_chalk(db, ty))), 119 chalk_ir::TyKind::Array(ty, _size) => TyKind::Array(Substs::single(from_chalk(db, ty))),
132 chalk_ir::TyKind::Placeholder(idx) => { 120 chalk_ir::TyKind::Placeholder(idx) => TyKind::Placeholder(idx),
133 assert_eq!(idx.ui, UniverseIndex::ROOT);
134 let interned_id = crate::db::GlobalTypeParamId::from_intern_id(
135 crate::salsa::InternId::from(idx.idx),
136 );
137 TyKind::Placeholder(db.lookup_intern_type_param_id(interned_id))
138 }
139 chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Projection(proj)) => { 121 chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Projection(proj)) => {
140 let associated_ty = proj.associated_ty_id; 122 let associated_ty = proj.associated_ty_id;
141 let parameters = from_chalk(db, proj.substitution); 123 let parameters = from_chalk(db, proj.substitution);
142 TyKind::Alias(AliasTy::Projection(ProjectionTy { associated_ty, parameters })) 124 TyKind::Alias(AliasTy::Projection(ProjectionTy { associated_ty, parameters }))
143 } 125 }
144 chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Opaque(opaque_ty)) => { 126 chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Opaque(opaque_ty)) => {
145 let impl_trait_id = from_chalk(db, opaque_ty.opaque_ty_id); 127 let opaque_ty_id = opaque_ty.opaque_ty_id;
146 let parameters = from_chalk(db, opaque_ty.substitution); 128 let parameters = from_chalk(db, opaque_ty.substitution);
147 TyKind::Alias(AliasTy::Opaque(OpaqueTy { opaque_ty_id: impl_trait_id, parameters })) 129 TyKind::Alias(AliasTy::Opaque(OpaqueTy { opaque_ty_id, parameters }))
148 } 130 }
149 chalk_ir::TyKind::Function(chalk_ir::FnPointer { 131 chalk_ir::TyKind::Function(chalk_ir::FnPointer {
150 num_binders, 132 num_binders,
@@ -182,7 +164,7 @@ impl ToChalk for Ty {
182 } 164 }
183 165
184 chalk_ir::TyKind::OpaqueType(opaque_type_id, subst) => { 166 chalk_ir::TyKind::OpaqueType(opaque_type_id, subst) => {
185 TyKind::OpaqueType(from_chalk(db, opaque_type_id), from_chalk(db, subst)) 167 TyKind::OpaqueType(opaque_type_id, from_chalk(db, subst))
186 } 168 }
187 169
188 chalk_ir::TyKind::Scalar(scalar) => TyKind::Scalar(scalar), 170 chalk_ir::TyKind::Scalar(scalar) => TyKind::Scalar(scalar),
@@ -203,11 +185,7 @@ impl ToChalk for Ty {
203 TyKind::FnDef(fn_def_id, from_chalk(db, subst)) 185 TyKind::FnDef(fn_def_id, from_chalk(db, subst))
204 } 186 }
205 187
206 chalk_ir::TyKind::Closure(id, subst) => { 188 chalk_ir::TyKind::Closure(id, subst) => TyKind::Closure(id, from_chalk(db, subst)),
207 let id: crate::db::ClosureId = id.into();
208 let (def, expr) = db.lookup_intern_closure(id);
209 TyKind::Closure(def, expr, from_chalk(db, subst))
210 }
211 189
212 chalk_ir::TyKind::Foreign(foreign_def_id) => TyKind::ForeignType(foreign_def_id), 190 chalk_ir::TyKind::Foreign(foreign_def_id) => TyKind::ForeignType(foreign_def_id),
213 chalk_ir::TyKind::Generator(_, _) => unimplemented!(), // FIXME 191 chalk_ir::TyKind::Generator(_, _) => unimplemented!(), // FIXME
@@ -289,21 +267,6 @@ impl ToChalk for hir_def::TraitId {
289 } 267 }
290} 268}
291 269
292impl ToChalk for OpaqueTyId {
293 type Chalk = chalk_ir::OpaqueTyId<Interner>;
294
295 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::OpaqueTyId<Interner> {
296 db.intern_impl_trait_id(self).into()
297 }
298
299 fn from_chalk(
300 db: &dyn HirDatabase,
301 opaque_ty_id: chalk_ir::OpaqueTyId<Interner>,
302 ) -> OpaqueTyId {
303 db.lookup_intern_impl_trait_id(opaque_ty_id.into())
304 }
305}
306
307impl ToChalk for hir_def::ImplId { 270impl ToChalk for hir_def::ImplId {
308 type Chalk = ImplId; 271 type Chalk = ImplId;
309 272