diff options
Diffstat (limited to 'crates/ra_hir_ty/src/traits/chalk/mapping.rs')
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk/mapping.rs | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/crates/ra_hir_ty/src/traits/chalk/mapping.rs b/crates/ra_hir_ty/src/traits/chalk/mapping.rs index a83d82fd8..7841a0e21 100644 --- a/crates/ra_hir_ty/src/traits/chalk/mapping.rs +++ b/crates/ra_hir_ty/src/traits/chalk/mapping.rs | |||
@@ -15,8 +15,8 @@ use crate::{ | |||
15 | db::HirDatabase, | 15 | db::HirDatabase, |
16 | primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness, Uncertain}, | 16 | primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness, Uncertain}, |
17 | traits::{builtin, AssocTyValue, Canonical, Impl, Obligation}, | 17 | traits::{builtin, AssocTyValue, Canonical, Impl, Obligation}, |
18 | ApplicationTy, GenericPredicate, InEnvironment, ProjectionPredicate, ProjectionTy, Substs, | 18 | ApplicationTy, CallableDef, GenericPredicate, InEnvironment, ProjectionPredicate, ProjectionTy, |
19 | TraitEnvironment, TraitRef, Ty, TypeCtor, | 19 | Substs, TraitEnvironment, TraitRef, Ty, TypeCtor, |
20 | }; | 20 | }; |
21 | 21 | ||
22 | use super::interner::*; | 22 | use super::interner::*; |
@@ -217,11 +217,14 @@ impl ToChalk for TypeCtor { | |||
217 | TypeCtor::Slice => TypeName::Slice, | 217 | TypeCtor::Slice => TypeName::Slice, |
218 | TypeCtor::Ref(mutability) => TypeName::Ref(mutability.to_chalk(db)), | 218 | TypeCtor::Ref(mutability) => TypeName::Ref(mutability.to_chalk(db)), |
219 | TypeCtor::Str => TypeName::Str, | 219 | TypeCtor::Str => TypeName::Str, |
220 | TypeCtor::FnDef(callable_def) => { | ||
221 | let id = callable_def.to_chalk(db); | ||
222 | TypeName::FnDef(id) | ||
223 | } | ||
220 | TypeCtor::Int(Uncertain::Unknown) | 224 | TypeCtor::Int(Uncertain::Unknown) |
221 | | TypeCtor::Float(Uncertain::Unknown) | 225 | | TypeCtor::Float(Uncertain::Unknown) |
222 | | TypeCtor::Adt(_) | 226 | | TypeCtor::Adt(_) |
223 | | TypeCtor::Array | 227 | | TypeCtor::Array |
224 | | TypeCtor::FnDef(_) | ||
225 | | TypeCtor::FnPtr { .. } | 228 | | TypeCtor::FnPtr { .. } |
226 | | TypeCtor::Never | 229 | | TypeCtor::Never |
227 | | TypeCtor::Closure { .. } => { | 230 | | TypeCtor::Closure { .. } => { |
@@ -260,7 +263,10 @@ impl ToChalk for TypeCtor { | |||
260 | TypeName::Ref(mutability) => TypeCtor::Ref(from_chalk(db, mutability)), | 263 | TypeName::Ref(mutability) => TypeCtor::Ref(from_chalk(db, mutability)), |
261 | TypeName::Str => TypeCtor::Str, | 264 | TypeName::Str => TypeCtor::Str, |
262 | 265 | ||
263 | TypeName::FnDef(_) => unreachable!(), | 266 | TypeName::FnDef(fn_def_id) => { |
267 | let callable_def = from_chalk(db, fn_def_id); | ||
268 | TypeCtor::FnDef(callable_def) | ||
269 | } | ||
264 | 270 | ||
265 | TypeName::Error => { | 271 | TypeName::Error => { |
266 | // this should not be reached, since we don't represent TypeName::Error with TypeCtor | 272 | // this should not be reached, since we don't represent TypeName::Error with TypeCtor |
@@ -347,6 +353,18 @@ impl ToChalk for Impl { | |||
347 | } | 353 | } |
348 | } | 354 | } |
349 | 355 | ||
356 | impl ToChalk for CallableDef { | ||
357 | type Chalk = FnDefId; | ||
358 | |||
359 | fn to_chalk(self, db: &dyn HirDatabase) -> FnDefId { | ||
360 | db.intern_callable_def(self).into() | ||
361 | } | ||
362 | |||
363 | fn from_chalk(db: &dyn HirDatabase, fn_def_id: FnDefId) -> CallableDef { | ||
364 | db.lookup_intern_callable_def(fn_def_id.into()) | ||
365 | } | ||
366 | } | ||
367 | |||
350 | impl ToChalk for TypeAliasId { | 368 | impl ToChalk for TypeAliasId { |
351 | type Chalk = AssocTypeId; | 369 | type Chalk = AssocTypeId; |
352 | 370 | ||