aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/traits/chalk
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/traits/chalk')
-rw-r--r--crates/ra_hir_ty/src/traits/chalk/interner.rs2
-rw-r--r--crates/ra_hir_ty/src/traits/chalk/mapping.rs26
-rw-r--r--crates/ra_hir_ty/src/traits/chalk/tls.rs18
3 files changed, 40 insertions, 6 deletions
diff --git a/crates/ra_hir_ty/src/traits/chalk/interner.rs b/crates/ra_hir_ty/src/traits/chalk/interner.rs
index 060372819..2a27f8ed8 100644
--- a/crates/ra_hir_ty/src/traits/chalk/interner.rs
+++ b/crates/ra_hir_ty/src/traits/chalk/interner.rs
@@ -20,6 +20,8 @@ pub type ImplId = chalk_ir::ImplId<Interner>;
20pub type ImplDatum = chalk_rust_ir::ImplDatum<Interner>; 20pub type ImplDatum = chalk_rust_ir::ImplDatum<Interner>;
21pub type AssociatedTyValueId = chalk_rust_ir::AssociatedTyValueId<Interner>; 21pub type AssociatedTyValueId = chalk_rust_ir::AssociatedTyValueId<Interner>;
22pub type AssociatedTyValue = chalk_rust_ir::AssociatedTyValue<Interner>; 22pub type AssociatedTyValue = chalk_rust_ir::AssociatedTyValue<Interner>;
23pub type FnDefId = chalk_ir::FnDefId<Interner>;
24pub type FnDefDatum = chalk_rust_ir::FnDefDatum<Interner>;
23 25
24impl chalk_ir::interner::Interner for Interner { 26impl chalk_ir::interner::Interner for Interner {
25 type InternedType = Box<chalk_ir::TyData<Self>>; // FIXME use Arc? 27 type InternedType = Box<chalk_ir::TyData<Self>>; // FIXME use Arc?
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
22use super::interner::*; 22use 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
356impl 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
350impl ToChalk for TypeAliasId { 368impl ToChalk for TypeAliasId {
351 type Chalk = AssocTypeId; 369 type Chalk = AssocTypeId;
352 370
diff --git a/crates/ra_hir_ty/src/traits/chalk/tls.rs b/crates/ra_hir_ty/src/traits/chalk/tls.rs
index ebf402a07..d88828c7c 100644
--- a/crates/ra_hir_ty/src/traits/chalk/tls.rs
+++ b/crates/ra_hir_ty/src/traits/chalk/tls.rs
@@ -247,10 +247,24 @@ impl DebugContext<'_> {
247 247
248 pub fn debug_fn_def_id( 248 pub fn debug_fn_def_id(
249 &self, 249 &self,
250 _fn_def_id: chalk_ir::FnDefId<Interner>, 250 fn_def_id: chalk_ir::FnDefId<Interner>,
251 fmt: &mut fmt::Formatter<'_>, 251 fmt: &mut fmt::Formatter<'_>,
252 ) -> Result<(), fmt::Error> { 252 ) -> Result<(), fmt::Error> {
253 write!(fmt, "fn") 253 let def: CallableDef = from_chalk(self.0, fn_def_id);
254 let name = match def {
255 CallableDef::FunctionId(ff) => self.0.function_data(ff).name.clone(),
256 CallableDef::StructId(s) => self.0.struct_data(s).name.clone(),
257 CallableDef::EnumVariantId(e) => {
258 let enum_data = self.0.enum_data(e.parent);
259 enum_data.variants[e.local_id].name.clone()
260 }
261 };
262 match def {
263 CallableDef::FunctionId(_) => write!(fmt, "{{fn {}}}", name),
264 CallableDef::StructId(_) | CallableDef::EnumVariantId(_) => {
265 write!(fmt, "{{ctor {}}}", name)
266 }
267 }
254 } 268 }
255 269
256 pub fn debug_const( 270 pub fn debug_const(