diff options
Diffstat (limited to 'crates/hir_ty/src/traits')
-rw-r--r-- | crates/hir_ty/src/traits/chalk.rs | 2 | ||||
-rw-r--r-- | crates/hir_ty/src/traits/chalk/mapping.rs | 35 |
2 files changed, 17 insertions, 20 deletions
diff --git a/crates/hir_ty/src/traits/chalk.rs b/crates/hir_ty/src/traits/chalk.rs index 5a8b5cd86..f03b92422 100644 --- a/crates/hir_ty/src/traits/chalk.rs +++ b/crates/hir_ty/src/traits/chalk.rs | |||
@@ -22,7 +22,7 @@ use crate::{ | |||
22 | to_assoc_type_id, to_chalk_trait_id, | 22 | to_assoc_type_id, to_chalk_trait_id, |
23 | utils::generics, | 23 | utils::generics, |
24 | AliasEq, AliasTy, BoundVar, CallableDefId, DebruijnIndex, FnDefId, ProjectionTy, Substitution, | 24 | AliasEq, AliasTy, BoundVar, CallableDefId, DebruijnIndex, FnDefId, ProjectionTy, Substitution, |
25 | TraitRef, Ty, TyBuilder, TyKind, WhereClause, | 25 | TraitRef, Ty, TyBuilder, TyExt, TyKind, WhereClause, |
26 | }; | 26 | }; |
27 | use mapping::{ | 27 | use mapping::{ |
28 | convert_where_clauses, generic_predicate_to_inline_bound, make_binders, TypeAliasAsValue, | 28 | convert_where_clauses, generic_predicate_to_inline_bound, make_binders, TypeAliasAsValue, |
diff --git a/crates/hir_ty/src/traits/chalk/mapping.rs b/crates/hir_ty/src/traits/chalk/mapping.rs index 3047fbacb..cf73cb078 100644 --- a/crates/hir_ty/src/traits/chalk/mapping.rs +++ b/crates/hir_ty/src/traits/chalk/mapping.rs | |||
@@ -3,16 +3,17 @@ | |||
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, LifetimeData}; | 6 | use chalk_ir::{cast::Cast, interner::HasInterner}; |
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, primitive::UintTy, AliasTy, CallableDefId, | 13 | chalk_ext::ProjectionTyExt, db::HirDatabase, dummy_usize_const, static_lifetime, AliasTy, |
14 | Canonical, DomainGoal, FnPointer, GenericArg, InEnvironment, OpaqueTy, ProjectionTy, | 14 | CallableDefId, Canonical, Const, DomainGoal, FnPointer, GenericArg, InEnvironment, Lifetime, |
15 | QuantifiedWhereClause, Scalar, Substitution, TraitRef, Ty, TypeWalk, WhereClause, | 15 | OpaqueTy, ProjectionTy, QuantifiedWhereClause, Substitution, TraitRef, Ty, TypeWalk, |
16 | WhereClause, | ||
16 | }; | 17 | }; |
17 | 18 | ||
18 | use super::interner::*; | 19 | use super::interner::*; |
@@ -22,8 +23,8 @@ impl ToChalk for Ty { | |||
22 | type Chalk = chalk_ir::Ty<Interner>; | 23 | type Chalk = chalk_ir::Ty<Interner>; |
23 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Ty<Interner> { | 24 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Ty<Interner> { |
24 | match self.into_inner() { | 25 | match self.into_inner() { |
25 | TyKind::Ref(m, ty) => ref_to_chalk(db, m, ty), | 26 | TyKind::Ref(m, lt, ty) => ref_to_chalk(db, m, lt, ty), |
26 | TyKind::Array(ty) => array_to_chalk(db, ty), | 27 | TyKind::Array(ty, size) => array_to_chalk(db, ty, size), |
27 | TyKind::Function(FnPointer { sig, substitution: substs, .. }) => { | 28 | TyKind::Function(FnPointer { sig, substitution: substs, .. }) => { |
28 | let substitution = chalk_ir::FnSubst(substs.0.to_chalk(db)); | 29 | let substitution = chalk_ir::FnSubst(substs.0.to_chalk(db)); |
29 | chalk_ir::TyKind::Function(chalk_ir::FnPointer { | 30 | chalk_ir::TyKind::Function(chalk_ir::FnPointer { |
@@ -100,7 +101,7 @@ impl ToChalk for Ty { | |||
100 | ); | 101 | ); |
101 | let bounded_ty = chalk_ir::DynTy { | 102 | let bounded_ty = chalk_ir::DynTy { |
102 | bounds: chalk_ir::Binders::new(binders, where_clauses), | 103 | bounds: chalk_ir::Binders::new(binders, where_clauses), |
103 | lifetime: LifetimeData::Static.intern(&Interner), | 104 | lifetime: static_lifetime(), |
104 | }; | 105 | }; |
105 | chalk_ir::TyKind::Dyn(bounded_ty).intern(&Interner) | 106 | chalk_ir::TyKind::Dyn(bounded_ty).intern(&Interner) |
106 | } | 107 | } |
@@ -110,7 +111,7 @@ impl ToChalk for Ty { | |||
110 | fn from_chalk(db: &dyn HirDatabase, chalk: chalk_ir::Ty<Interner>) -> Self { | 111 | fn from_chalk(db: &dyn HirDatabase, chalk: chalk_ir::Ty<Interner>) -> Self { |
111 | match chalk.data(&Interner).kind.clone() { | 112 | match chalk.data(&Interner).kind.clone() { |
112 | chalk_ir::TyKind::Error => TyKind::Error, | 113 | chalk_ir::TyKind::Error => TyKind::Error, |
113 | chalk_ir::TyKind::Array(ty, _size) => TyKind::Array(from_chalk(db, ty)), | 114 | chalk_ir::TyKind::Array(ty, size) => TyKind::Array(from_chalk(db, ty), size), |
114 | chalk_ir::TyKind::Placeholder(idx) => TyKind::Placeholder(idx), | 115 | chalk_ir::TyKind::Placeholder(idx) => TyKind::Placeholder(idx), |
115 | chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Projection(proj)) => { | 116 | chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Projection(proj)) => { |
116 | let associated_ty = proj.associated_ty_id; | 117 | let associated_ty = proj.associated_ty_id; |
@@ -149,6 +150,7 @@ impl ToChalk for Ty { | |||
149 | where_clauses.bounds.binders.clone(), | 150 | where_clauses.bounds.binders.clone(), |
150 | crate::QuantifiedWhereClauses::from_iter(&Interner, bounds), | 151 | crate::QuantifiedWhereClauses::from_iter(&Interner, bounds), |
151 | ), | 152 | ), |
153 | lifetime: static_lifetime(), | ||
152 | }) | 154 | }) |
153 | } | 155 | } |
154 | 156 | ||
@@ -167,8 +169,8 @@ impl ToChalk for Ty { | |||
167 | } | 169 | } |
168 | chalk_ir::TyKind::Raw(mutability, ty) => TyKind::Raw(mutability, from_chalk(db, ty)), | 170 | chalk_ir::TyKind::Raw(mutability, ty) => TyKind::Raw(mutability, from_chalk(db, ty)), |
169 | chalk_ir::TyKind::Slice(ty) => TyKind::Slice(from_chalk(db, ty)), | 171 | chalk_ir::TyKind::Slice(ty) => TyKind::Slice(from_chalk(db, ty)), |
170 | chalk_ir::TyKind::Ref(mutability, _lifetime, ty) => { | 172 | chalk_ir::TyKind::Ref(mutability, lifetime, ty) => { |
171 | TyKind::Ref(mutability, from_chalk(db, ty)) | 173 | TyKind::Ref(mutability, lifetime, from_chalk(db, ty)) |
172 | } | 174 | } |
173 | chalk_ir::TyKind::Str => TyKind::Str, | 175 | chalk_ir::TyKind::Str => TyKind::Str, |
174 | chalk_ir::TyKind::Never => TyKind::Never, | 176 | chalk_ir::TyKind::Never => TyKind::Never, |
@@ -192,24 +194,19 @@ impl ToChalk for Ty { | |||
192 | fn ref_to_chalk( | 194 | fn ref_to_chalk( |
193 | db: &dyn HirDatabase, | 195 | db: &dyn HirDatabase, |
194 | mutability: chalk_ir::Mutability, | 196 | mutability: chalk_ir::Mutability, |
197 | _lifetime: Lifetime, | ||
195 | ty: Ty, | 198 | ty: Ty, |
196 | ) -> chalk_ir::Ty<Interner> { | 199 | ) -> chalk_ir::Ty<Interner> { |
197 | let arg = ty.to_chalk(db); | 200 | let arg = ty.to_chalk(db); |
198 | let lifetime = LifetimeData::Static.intern(&Interner); | 201 | let lifetime = static_lifetime(); |
199 | chalk_ir::TyKind::Ref(mutability, lifetime, arg).intern(&Interner) | 202 | chalk_ir::TyKind::Ref(mutability, lifetime, arg).intern(&Interner) |
200 | } | 203 | } |
201 | 204 | ||
202 | /// We currently don't model constants, but Chalk does. So, we have to insert a | 205 | /// We currently don't model constants, but Chalk does. So, we have to insert a |
203 | /// fake constant here, because Chalks built-in logic may expect it to be there. | 206 | /// fake constant here, because Chalks built-in logic may expect it to be there. |
204 | fn array_to_chalk(db: &dyn HirDatabase, ty: Ty) -> chalk_ir::Ty<Interner> { | 207 | fn array_to_chalk(db: &dyn HirDatabase, ty: Ty, _: Const) -> chalk_ir::Ty<Interner> { |
205 | let arg = ty.to_chalk(db); | 208 | let arg = ty.to_chalk(db); |
206 | let usize_ty = chalk_ir::TyKind::Scalar(Scalar::Uint(UintTy::Usize)).intern(&Interner); | 209 | chalk_ir::TyKind::Array(arg, dummy_usize_const()).intern(&Interner) |
207 | let const_ = chalk_ir::ConstData { | ||
208 | ty: usize_ty, | ||
209 | value: chalk_ir::ConstValue::Concrete(chalk_ir::ConcreteConst { interned: () }), | ||
210 | } | ||
211 | .intern(&Interner); | ||
212 | chalk_ir::TyKind::Array(arg, const_).intern(&Interner) | ||
213 | } | 210 | } |
214 | 211 | ||
215 | impl ToChalk for GenericArg { | 212 | impl ToChalk for GenericArg { |