diff options
Diffstat (limited to 'crates/ra_hir_ty/src/traits')
-rw-r--r-- | crates/ra_hir_ty/src/traits/builtin.rs | 3 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk.rs | 87 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk/interner.rs | 14 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk/mapping.rs | 93 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk/tls.rs | 18 |
5 files changed, 145 insertions, 70 deletions
diff --git a/crates/ra_hir_ty/src/traits/builtin.rs b/crates/ra_hir_ty/src/traits/builtin.rs index ccab246bf..88a422d2c 100644 --- a/crates/ra_hir_ty/src/traits/builtin.rs +++ b/crates/ra_hir_ty/src/traits/builtin.rs | |||
@@ -290,8 +290,7 @@ fn trait_object_unsize_impl_datum( | |||
290 | let self_trait_ref = TraitRef { trait_, substs: self_substs }; | 290 | let self_trait_ref = TraitRef { trait_, substs: self_substs }; |
291 | let where_clauses = vec![GenericPredicate::Implemented(self_trait_ref)]; | 291 | let where_clauses = vec![GenericPredicate::Implemented(self_trait_ref)]; |
292 | 292 | ||
293 | let impl_substs = | 293 | let impl_substs = Substs::builder(2).push(self_ty).push(Ty::Dyn(target_bounds.into())).build(); |
294 | Substs::builder(2).push(self_ty).push(Ty::Dyn(target_bounds.clone().into())).build(); | ||
295 | 294 | ||
296 | let trait_ref = TraitRef { trait_: unsize_trait, substs: impl_substs }; | 295 | let trait_ref = TraitRef { trait_: unsize_trait, substs: impl_substs }; |
297 | 296 | ||
diff --git a/crates/ra_hir_ty/src/traits/chalk.rs b/crates/ra_hir_ty/src/traits/chalk.rs index e2f2a9ccb..61de3cc30 100644 --- a/crates/ra_hir_ty/src/traits/chalk.rs +++ b/crates/ra_hir_ty/src/traits/chalk.rs | |||
@@ -4,6 +4,7 @@ use std::sync::Arc; | |||
4 | use log::debug; | 4 | use log::debug; |
5 | 5 | ||
6 | use chalk_ir::{fold::shift::Shift, GenericArg, TypeName}; | 6 | use chalk_ir::{fold::shift::Shift, GenericArg, TypeName}; |
7 | use chalk_solve::rust_ir::{self, WellKnownTrait}; | ||
7 | 8 | ||
8 | use hir_def::{ | 9 | use hir_def::{ |
9 | lang_item::{lang_attr, LangItemTarget}, | 10 | lang_item::{lang_attr, LangItemTarget}, |
@@ -14,9 +15,8 @@ use ra_db::{salsa::InternKey, CrateId}; | |||
14 | use super::{builtin, AssocTyValue, ChalkContext, Impl}; | 15 | use super::{builtin, AssocTyValue, ChalkContext, Impl}; |
15 | use crate::{ | 16 | use crate::{ |
16 | db::HirDatabase, display::HirDisplay, method_resolution::TyFingerprint, utils::generics, | 17 | db::HirDatabase, display::HirDisplay, method_resolution::TyFingerprint, utils::generics, |
17 | DebruijnIndex, GenericPredicate, Substs, Ty, TypeCtor, | 18 | CallableDef, DebruijnIndex, GenericPredicate, Substs, Ty, TypeCtor, |
18 | }; | 19 | }; |
19 | use chalk_rust_ir::WellKnownTrait; | ||
20 | use mapping::{convert_where_clauses, generic_predicate_to_inline_bound, make_binders}; | 20 | use mapping::{convert_where_clauses, generic_predicate_to_inline_bound, make_binders}; |
21 | 21 | ||
22 | pub use self::interner::*; | 22 | pub use self::interner::*; |
@@ -54,10 +54,9 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> { | |||
54 | 54 | ||
55 | fn fn_def_datum( | 55 | fn fn_def_datum( |
56 | &self, | 56 | &self, |
57 | _fn_def_id: chalk_ir::FnDefId<Interner>, | 57 | fn_def_id: chalk_ir::FnDefId<Interner>, |
58 | ) -> Arc<chalk_rust_ir::FnDefDatum<Interner>> { | 58 | ) -> Arc<rust_ir::FnDefDatum<Interner>> { |
59 | // We don't yet provide any FnDefs to Chalk | 59 | self.db.fn_def_datum(self.krate, fn_def_id) |
60 | unimplemented!() | ||
61 | } | 60 | } |
62 | 61 | ||
63 | fn impls_for_trait( | 62 | fn impls_for_trait( |
@@ -113,7 +112,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> { | |||
113 | } | 112 | } |
114 | fn well_known_trait_id( | 113 | fn well_known_trait_id( |
115 | &self, | 114 | &self, |
116 | well_known_trait: chalk_rust_ir::WellKnownTrait, | 115 | well_known_trait: rust_ir::WellKnownTrait, |
117 | ) -> Option<chalk_ir::TraitId<Interner>> { | 116 | ) -> Option<chalk_ir::TraitId<Interner>> { |
118 | let lang_attr = lang_attr_from_well_known_trait(well_known_trait); | 117 | let lang_attr = lang_attr_from_well_known_trait(well_known_trait); |
119 | let lang_items = self.db.crate_lang_items(self.krate); | 118 | let lang_items = self.db.crate_lang_items(self.krate); |
@@ -134,13 +133,13 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> { | |||
134 | fn opaque_ty_data( | 133 | fn opaque_ty_data( |
135 | &self, | 134 | &self, |
136 | _id: chalk_ir::OpaqueTyId<Interner>, | 135 | _id: chalk_ir::OpaqueTyId<Interner>, |
137 | ) -> Arc<chalk_rust_ir::OpaqueTyDatum<Interner>> { | 136 | ) -> Arc<rust_ir::OpaqueTyDatum<Interner>> { |
138 | unimplemented!() | 137 | unimplemented!() |
139 | } | 138 | } |
140 | 139 | ||
141 | fn force_impl_for( | 140 | fn force_impl_for( |
142 | &self, | 141 | &self, |
143 | _well_known: chalk_rust_ir::WellKnownTrait, | 142 | _well_known: rust_ir::WellKnownTrait, |
144 | _ty: &chalk_ir::TyData<Interner>, | 143 | _ty: &chalk_ir::TyData<Interner>, |
145 | ) -> Option<bool> { | 144 | ) -> Option<bool> { |
146 | // this method is mostly for rustc | 145 | // this method is mostly for rustc |
@@ -151,6 +150,10 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> { | |||
151 | // FIXME: implement actual object safety | 150 | // FIXME: implement actual object safety |
152 | true | 151 | true |
153 | } | 152 | } |
153 | |||
154 | fn hidden_opaque_type(&self, _id: chalk_ir::OpaqueTyId<Interner>) -> chalk_ir::Ty<Interner> { | ||
155 | Ty::Unknown.to_chalk(self.db) | ||
156 | } | ||
154 | } | 157 | } |
155 | 158 | ||
156 | pub(crate) fn program_clauses_for_chalk_env_query( | 159 | pub(crate) fn program_clauses_for_chalk_env_query( |
@@ -189,7 +192,7 @@ pub(crate) fn associated_ty_data_query( | |||
189 | .collect(); | 192 | .collect(); |
190 | 193 | ||
191 | let where_clauses = convert_where_clauses(db, type_alias.into(), &bound_vars); | 194 | let where_clauses = convert_where_clauses(db, type_alias.into(), &bound_vars); |
192 | let bound_data = chalk_rust_ir::AssociatedTyDatumBound { bounds, where_clauses }; | 195 | let bound_data = rust_ir::AssociatedTyDatumBound { bounds, where_clauses }; |
193 | let datum = AssociatedTyDatum { | 196 | let datum = AssociatedTyDatum { |
194 | trait_id: trait_.to_chalk(db), | 197 | trait_id: trait_.to_chalk(db), |
195 | id, | 198 | id, |
@@ -210,7 +213,7 @@ pub(crate) fn trait_datum_query( | |||
210 | debug!("trait {:?} = {:?}", trait_id, trait_data.name); | 213 | debug!("trait {:?} = {:?}", trait_id, trait_data.name); |
211 | let generic_params = generics(db.upcast(), trait_.into()); | 214 | let generic_params = generics(db.upcast(), trait_.into()); |
212 | let bound_vars = Substs::bound_vars(&generic_params, DebruijnIndex::INNERMOST); | 215 | let bound_vars = Substs::bound_vars(&generic_params, DebruijnIndex::INNERMOST); |
213 | let flags = chalk_rust_ir::TraitFlags { | 216 | let flags = rust_ir::TraitFlags { |
214 | auto: trait_data.auto, | 217 | auto: trait_data.auto, |
215 | upstream: trait_.lookup(db.upcast()).container.module(db.upcast()).krate != krate, | 218 | upstream: trait_.lookup(db.upcast()).container.module(db.upcast()).krate != krate, |
216 | non_enumerable: true, | 219 | non_enumerable: true, |
@@ -222,7 +225,7 @@ pub(crate) fn trait_datum_query( | |||
222 | let where_clauses = convert_where_clauses(db, trait_.into(), &bound_vars); | 225 | let where_clauses = convert_where_clauses(db, trait_.into(), &bound_vars); |
223 | let associated_ty_ids = | 226 | let associated_ty_ids = |
224 | trait_data.associated_types().map(|type_alias| type_alias.to_chalk(db)).collect(); | 227 | trait_data.associated_types().map(|type_alias| type_alias.to_chalk(db)).collect(); |
225 | let trait_datum_bound = chalk_rust_ir::TraitDatumBound { where_clauses }; | 228 | let trait_datum_bound = rust_ir::TraitDatumBound { where_clauses }; |
226 | let well_known = | 229 | let well_known = |
227 | lang_attr(db.upcast(), trait_).and_then(|name| well_known_trait_from_lang_attr(&name)); | 230 | lang_attr(db.upcast(), trait_).and_then(|name| well_known_trait_from_lang_attr(&name)); |
228 | let trait_datum = TraitDatum { | 231 | let trait_datum = TraitDatum { |
@@ -272,12 +275,12 @@ pub(crate) fn struct_datum_query( | |||
272 | convert_where_clauses(db, generic_def, &bound_vars) | 275 | convert_where_clauses(db, generic_def, &bound_vars) |
273 | }) | 276 | }) |
274 | .unwrap_or_else(Vec::new); | 277 | .unwrap_or_else(Vec::new); |
275 | let flags = chalk_rust_ir::AdtFlags { | 278 | let flags = rust_ir::AdtFlags { |
276 | upstream, | 279 | upstream, |
277 | // FIXME set fundamental flag correctly | 280 | // FIXME set fundamental flag correctly |
278 | fundamental: false, | 281 | fundamental: false, |
279 | }; | 282 | }; |
280 | let struct_datum_bound = chalk_rust_ir::AdtDatumBound { | 283 | let struct_datum_bound = rust_ir::AdtDatumBound { |
281 | fields: Vec::new(), // FIXME add fields (only relevant for auto traits) | 284 | fields: Vec::new(), // FIXME add fields (only relevant for auto traits) |
282 | where_clauses, | 285 | where_clauses, |
283 | }; | 286 | }; |
@@ -317,9 +320,9 @@ fn impl_def_datum( | |||
317 | let bound_vars = Substs::bound_vars(&generic_params, DebruijnIndex::INNERMOST); | 320 | let bound_vars = Substs::bound_vars(&generic_params, DebruijnIndex::INNERMOST); |
318 | let trait_ = trait_ref.trait_; | 321 | let trait_ = trait_ref.trait_; |
319 | let impl_type = if impl_id.lookup(db.upcast()).container.module(db.upcast()).krate == krate { | 322 | let impl_type = if impl_id.lookup(db.upcast()).container.module(db.upcast()).krate == krate { |
320 | chalk_rust_ir::ImplType::Local | 323 | rust_ir::ImplType::Local |
321 | } else { | 324 | } else { |
322 | chalk_rust_ir::ImplType::External | 325 | rust_ir::ImplType::External |
323 | }; | 326 | }; |
324 | let where_clauses = convert_where_clauses(db, impl_id.into(), &bound_vars); | 327 | let where_clauses = convert_where_clauses(db, impl_id.into(), &bound_vars); |
325 | let negative = impl_data.is_negative; | 328 | let negative = impl_data.is_negative; |
@@ -332,13 +335,9 @@ fn impl_def_datum( | |||
332 | ); | 335 | ); |
333 | let trait_ref = trait_ref.to_chalk(db); | 336 | let trait_ref = trait_ref.to_chalk(db); |
334 | 337 | ||
335 | let polarity = if negative { | 338 | let polarity = if negative { rust_ir::Polarity::Negative } else { rust_ir::Polarity::Positive }; |
336 | chalk_rust_ir::Polarity::Negative | ||
337 | } else { | ||
338 | chalk_rust_ir::Polarity::Positive | ||
339 | }; | ||
340 | 339 | ||
341 | let impl_datum_bound = chalk_rust_ir::ImplDatumBound { trait_ref, where_clauses }; | 340 | let impl_datum_bound = rust_ir::ImplDatumBound { trait_ref, where_clauses }; |
342 | let trait_data = db.trait_data(trait_); | 341 | let trait_data = db.trait_data(trait_); |
343 | let associated_ty_value_ids = impl_data | 342 | let associated_ty_value_ids = impl_data |
344 | .items | 343 | .items |
@@ -396,8 +395,8 @@ fn type_alias_associated_ty_value( | |||
396 | .associated_type_by_name(&type_alias_data.name) | 395 | .associated_type_by_name(&type_alias_data.name) |
397 | .expect("assoc ty value should not exist"); // validated when building the impl data as well | 396 | .expect("assoc ty value should not exist"); // validated when building the impl data as well |
398 | let ty = db.ty(type_alias.into()); | 397 | let ty = db.ty(type_alias.into()); |
399 | let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty: ty.value.to_chalk(db) }; | 398 | let value_bound = rust_ir::AssociatedTyValueBound { ty: ty.value.to_chalk(db) }; |
400 | let value = chalk_rust_ir::AssociatedTyValue { | 399 | let value = rust_ir::AssociatedTyValue { |
401 | impl_id: Impl::ImplDef(impl_id).to_chalk(db), | 400 | impl_id: Impl::ImplDef(impl_id).to_chalk(db), |
402 | associated_ty_id: assoc_ty.to_chalk(db), | 401 | associated_ty_id: assoc_ty.to_chalk(db), |
403 | value: make_binders(value_bound, ty.num_binders), | 402 | value: make_binders(value_bound, ty.num_binders), |
@@ -405,6 +404,26 @@ fn type_alias_associated_ty_value( | |||
405 | Arc::new(value) | 404 | Arc::new(value) |
406 | } | 405 | } |
407 | 406 | ||
407 | pub(crate) fn fn_def_datum_query( | ||
408 | db: &dyn HirDatabase, | ||
409 | _krate: CrateId, | ||
410 | fn_def_id: FnDefId, | ||
411 | ) -> Arc<FnDefDatum> { | ||
412 | let callable_def: CallableDef = from_chalk(db, fn_def_id); | ||
413 | let generic_params = generics(db.upcast(), callable_def.into()); | ||
414 | let sig = db.callable_item_signature(callable_def); | ||
415 | let bound_vars = Substs::bound_vars(&generic_params, DebruijnIndex::INNERMOST); | ||
416 | let where_clauses = convert_where_clauses(db, callable_def.into(), &bound_vars); | ||
417 | let bound = rust_ir::FnDefDatumBound { | ||
418 | // Note: Chalk doesn't actually use this information yet as far as I am aware, but we provide it anyway | ||
419 | argument_types: sig.value.params().iter().map(|ty| ty.clone().to_chalk(db)).collect(), | ||
420 | return_type: sig.value.ret().clone().to_chalk(db), | ||
421 | where_clauses, | ||
422 | }; | ||
423 | let datum = FnDefDatum { id: fn_def_id, binders: make_binders(bound, sig.num_binders) }; | ||
424 | Arc::new(datum) | ||
425 | } | ||
426 | |||
408 | impl From<AdtId> for crate::TypeCtorId { | 427 | impl From<AdtId> for crate::TypeCtorId { |
409 | fn from(struct_id: AdtId) -> Self { | 428 | fn from(struct_id: AdtId) -> Self { |
410 | struct_id.0 | 429 | struct_id.0 |
@@ -417,6 +436,18 @@ impl From<crate::TypeCtorId> for AdtId { | |||
417 | } | 436 | } |
418 | } | 437 | } |
419 | 438 | ||
439 | impl From<FnDefId> for crate::CallableDefId { | ||
440 | fn from(fn_def_id: FnDefId) -> Self { | ||
441 | InternKey::from_intern_id(fn_def_id.0) | ||
442 | } | ||
443 | } | ||
444 | |||
445 | impl From<crate::CallableDefId> for FnDefId { | ||
446 | fn from(callable_def_id: crate::CallableDefId) -> Self { | ||
447 | chalk_ir::FnDefId(callable_def_id.as_intern_id()) | ||
448 | } | ||
449 | } | ||
450 | |||
420 | impl From<ImplId> for crate::traits::GlobalImplId { | 451 | impl From<ImplId> for crate::traits::GlobalImplId { |
421 | fn from(impl_id: ImplId) -> Self { | 452 | fn from(impl_id: ImplId) -> Self { |
422 | InternKey::from_intern_id(impl_id.0) | 453 | InternKey::from_intern_id(impl_id.0) |
@@ -429,14 +460,14 @@ impl From<crate::traits::GlobalImplId> for ImplId { | |||
429 | } | 460 | } |
430 | } | 461 | } |
431 | 462 | ||
432 | impl From<chalk_rust_ir::AssociatedTyValueId<Interner>> for crate::traits::AssocTyValueId { | 463 | impl From<rust_ir::AssociatedTyValueId<Interner>> for crate::traits::AssocTyValueId { |
433 | fn from(id: chalk_rust_ir::AssociatedTyValueId<Interner>) -> Self { | 464 | fn from(id: rust_ir::AssociatedTyValueId<Interner>) -> Self { |
434 | Self::from_intern_id(id.0) | 465 | Self::from_intern_id(id.0) |
435 | } | 466 | } |
436 | } | 467 | } |
437 | 468 | ||
438 | impl From<crate::traits::AssocTyValueId> for chalk_rust_ir::AssociatedTyValueId<Interner> { | 469 | impl From<crate::traits::AssocTyValueId> for rust_ir::AssociatedTyValueId<Interner> { |
439 | fn from(assoc_ty_value_id: crate::traits::AssocTyValueId) -> Self { | 470 | fn from(assoc_ty_value_id: crate::traits::AssocTyValueId) -> Self { |
440 | chalk_rust_ir::AssociatedTyValueId(assoc_ty_value_id.as_intern_id()) | 471 | rust_ir::AssociatedTyValueId(assoc_ty_value_id.as_intern_id()) |
441 | } | 472 | } |
442 | } | 473 | } |
diff --git a/crates/ra_hir_ty/src/traits/chalk/interner.rs b/crates/ra_hir_ty/src/traits/chalk/interner.rs index 060372819..e27074ba6 100644 --- a/crates/ra_hir_ty/src/traits/chalk/interner.rs +++ b/crates/ra_hir_ty/src/traits/chalk/interner.rs | |||
@@ -11,15 +11,17 @@ use std::{fmt, sync::Arc}; | |||
11 | pub struct Interner; | 11 | pub struct Interner; |
12 | 12 | ||
13 | pub type AssocTypeId = chalk_ir::AssocTypeId<Interner>; | 13 | pub type AssocTypeId = chalk_ir::AssocTypeId<Interner>; |
14 | pub type AssociatedTyDatum = chalk_rust_ir::AssociatedTyDatum<Interner>; | 14 | pub type AssociatedTyDatum = chalk_solve::rust_ir::AssociatedTyDatum<Interner>; |
15 | pub type TraitId = chalk_ir::TraitId<Interner>; | 15 | pub type TraitId = chalk_ir::TraitId<Interner>; |
16 | pub type TraitDatum = chalk_rust_ir::TraitDatum<Interner>; | 16 | pub type TraitDatum = chalk_solve::rust_ir::TraitDatum<Interner>; |
17 | pub type AdtId = chalk_ir::AdtId<Interner>; | 17 | pub type AdtId = chalk_ir::AdtId<Interner>; |
18 | pub type StructDatum = chalk_rust_ir::AdtDatum<Interner>; | 18 | pub type StructDatum = chalk_solve::rust_ir::AdtDatum<Interner>; |
19 | pub type ImplId = chalk_ir::ImplId<Interner>; | 19 | pub type ImplId = chalk_ir::ImplId<Interner>; |
20 | pub type ImplDatum = chalk_rust_ir::ImplDatum<Interner>; | 20 | pub type ImplDatum = chalk_solve::rust_ir::ImplDatum<Interner>; |
21 | pub type AssociatedTyValueId = chalk_rust_ir::AssociatedTyValueId<Interner>; | 21 | pub type AssociatedTyValueId = chalk_solve::rust_ir::AssociatedTyValueId<Interner>; |
22 | pub type AssociatedTyValue = chalk_rust_ir::AssociatedTyValue<Interner>; | 22 | pub type AssociatedTyValue = chalk_solve::rust_ir::AssociatedTyValue<Interner>; |
23 | pub type FnDefId = chalk_ir::FnDefId<Interner>; | ||
24 | pub type FnDefDatum = chalk_solve::rust_ir::FnDefDatum<Interner>; | ||
23 | 25 | ||
24 | impl chalk_ir::interner::Interner for Interner { | 26 | impl 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..5f6daf842 100644 --- a/crates/ra_hir_ty/src/traits/chalk/mapping.rs +++ b/crates/ra_hir_ty/src/traits/chalk/mapping.rs | |||
@@ -7,6 +7,7 @@ use chalk_ir::{ | |||
7 | cast::Cast, fold::shift::Shift, interner::HasInterner, PlaceholderIndex, Scalar, TypeName, | 7 | cast::Cast, fold::shift::Shift, interner::HasInterner, PlaceholderIndex, Scalar, TypeName, |
8 | UniverseIndex, | 8 | UniverseIndex, |
9 | }; | 9 | }; |
10 | use chalk_solve::rust_ir; | ||
10 | 11 | ||
11 | use hir_def::{type_ref::Mutability, AssocContainerId, GenericDefId, Lookup, TypeAliasId}; | 12 | use hir_def::{type_ref::Mutability, AssocContainerId, GenericDefId, Lookup, TypeAliasId}; |
12 | use ra_db::salsa::InternKey; | 13 | use ra_db::salsa::InternKey; |
@@ -15,8 +16,8 @@ use crate::{ | |||
15 | db::HirDatabase, | 16 | db::HirDatabase, |
16 | primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness, Uncertain}, | 17 | primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness, Uncertain}, |
17 | traits::{builtin, AssocTyValue, Canonical, Impl, Obligation}, | 18 | traits::{builtin, AssocTyValue, Canonical, Impl, Obligation}, |
18 | ApplicationTy, GenericPredicate, InEnvironment, ProjectionPredicate, ProjectionTy, Substs, | 19 | ApplicationTy, CallableDef, GenericPredicate, InEnvironment, ProjectionPredicate, ProjectionTy, |
19 | TraitEnvironment, TraitRef, Ty, TypeCtor, | 20 | Substs, TraitEnvironment, TraitRef, Ty, TypeCtor, |
20 | }; | 21 | }; |
21 | 22 | ||
22 | use super::interner::*; | 23 | use super::interner::*; |
@@ -26,14 +27,19 @@ impl ToChalk for Ty { | |||
26 | type Chalk = chalk_ir::Ty<Interner>; | 27 | type Chalk = chalk_ir::Ty<Interner>; |
27 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Ty<Interner> { | 28 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Ty<Interner> { |
28 | match self { | 29 | match self { |
29 | Ty::Apply(apply_ty) => { | 30 | Ty::Apply(apply_ty) => match apply_ty.ctor { |
30 | if let TypeCtor::Ref(m) = apply_ty.ctor { | 31 | TypeCtor::Ref(m) => ref_to_chalk(db, m, apply_ty.parameters), |
31 | return ref_to_chalk(db, m, apply_ty.parameters); | 32 | TypeCtor::FnPtr { num_args: _ } => { |
33 | let substitution = apply_ty.parameters.to_chalk(db).shifted_in(&Interner); | ||
34 | chalk_ir::TyData::Function(chalk_ir::Fn { num_binders: 0, substitution }) | ||
35 | .intern(&Interner) | ||
32 | } | 36 | } |
33 | let name = apply_ty.ctor.to_chalk(db); | 37 | _ => { |
34 | let substitution = apply_ty.parameters.to_chalk(db); | 38 | let name = apply_ty.ctor.to_chalk(db); |
35 | chalk_ir::ApplicationTy { name, substitution }.cast(&Interner).intern(&Interner) | 39 | let substitution = apply_ty.parameters.to_chalk(db); |
36 | } | 40 | chalk_ir::ApplicationTy { name, substitution }.cast(&Interner).intern(&Interner) |
41 | } | ||
42 | }, | ||
37 | Ty::Projection(proj_ty) => { | 43 | Ty::Projection(proj_ty) => { |
38 | let associated_ty_id = proj_ty.associated_ty.to_chalk(db); | 44 | let associated_ty_id = proj_ty.associated_ty.to_chalk(db); |
39 | let substitution = proj_ty.parameters.to_chalk(db); | 45 | let substitution = proj_ty.parameters.to_chalk(db); |
@@ -93,9 +99,15 @@ impl ToChalk for Ty { | |||
93 | Ty::Projection(ProjectionTy { associated_ty, parameters }) | 99 | Ty::Projection(ProjectionTy { associated_ty, parameters }) |
94 | } | 100 | } |
95 | chalk_ir::TyData::Alias(chalk_ir::AliasTy::Opaque(_)) => unimplemented!(), | 101 | chalk_ir::TyData::Alias(chalk_ir::AliasTy::Opaque(_)) => unimplemented!(), |
96 | chalk_ir::TyData::Function(_) => unimplemented!(), | 102 | chalk_ir::TyData::Function(chalk_ir::Fn { num_binders: _, substitution }) => { |
103 | let parameters: Substs = from_chalk(db, substitution); | ||
104 | Ty::Apply(ApplicationTy { | ||
105 | ctor: TypeCtor::FnPtr { num_args: (parameters.len() - 1) as u16 }, | ||
106 | parameters, | ||
107 | }) | ||
108 | } | ||
97 | chalk_ir::TyData::BoundVar(idx) => Ty::Bound(idx), | 109 | chalk_ir::TyData::BoundVar(idx) => Ty::Bound(idx), |
98 | chalk_ir::TyData::InferenceVar(_iv) => Ty::Unknown, | 110 | chalk_ir::TyData::InferenceVar(_iv, _kind) => Ty::Unknown, |
99 | chalk_ir::TyData::Dyn(where_clauses) => { | 111 | chalk_ir::TyData::Dyn(where_clauses) => { |
100 | assert_eq!(where_clauses.bounds.binders.len(&Interner), 1); | 112 | assert_eq!(where_clauses.bounds.binders.len(&Interner), 1); |
101 | let predicates = where_clauses | 113 | let predicates = where_clauses |
@@ -217,13 +229,17 @@ impl ToChalk for TypeCtor { | |||
217 | TypeCtor::Slice => TypeName::Slice, | 229 | TypeCtor::Slice => TypeName::Slice, |
218 | TypeCtor::Ref(mutability) => TypeName::Ref(mutability.to_chalk(db)), | 230 | TypeCtor::Ref(mutability) => TypeName::Ref(mutability.to_chalk(db)), |
219 | TypeCtor::Str => TypeName::Str, | 231 | TypeCtor::Str => TypeName::Str, |
232 | TypeCtor::FnDef(callable_def) => { | ||
233 | let id = callable_def.to_chalk(db); | ||
234 | TypeName::FnDef(id) | ||
235 | } | ||
236 | TypeCtor::Never => TypeName::Never, | ||
237 | |||
220 | TypeCtor::Int(Uncertain::Unknown) | 238 | TypeCtor::Int(Uncertain::Unknown) |
221 | | TypeCtor::Float(Uncertain::Unknown) | 239 | | TypeCtor::Float(Uncertain::Unknown) |
222 | | TypeCtor::Adt(_) | 240 | | TypeCtor::Adt(_) |
223 | | TypeCtor::Array | 241 | | TypeCtor::Array |
224 | | TypeCtor::FnDef(_) | ||
225 | | TypeCtor::FnPtr { .. } | 242 | | TypeCtor::FnPtr { .. } |
226 | | TypeCtor::Never | ||
227 | | TypeCtor::Closure { .. } => { | 243 | | TypeCtor::Closure { .. } => { |
228 | // other TypeCtors get interned and turned into a chalk StructId | 244 | // other TypeCtors get interned and turned into a chalk StructId |
229 | let struct_id = db.intern_type_ctor(self).into(); | 245 | let struct_id = db.intern_type_ctor(self).into(); |
@@ -259,10 +275,14 @@ impl ToChalk for TypeCtor { | |||
259 | TypeName::Slice => TypeCtor::Slice, | 275 | TypeName::Slice => TypeCtor::Slice, |
260 | TypeName::Ref(mutability) => TypeCtor::Ref(from_chalk(db, mutability)), | 276 | TypeName::Ref(mutability) => TypeCtor::Ref(from_chalk(db, mutability)), |
261 | TypeName::Str => TypeCtor::Str, | 277 | TypeName::Str => TypeCtor::Str, |
278 | TypeName::Never => TypeCtor::Never, | ||
262 | 279 | ||
263 | TypeName::FnDef(_) => unreachable!(), | 280 | TypeName::FnDef(fn_def_id) => { |
281 | let callable_def = from_chalk(db, fn_def_id); | ||
282 | TypeCtor::FnDef(callable_def) | ||
283 | } | ||
264 | 284 | ||
265 | TypeName::Error => { | 285 | TypeName::Array | TypeName::Error => { |
266 | // this should not be reached, since we don't represent TypeName::Error with TypeCtor | 286 | // this should not be reached, since we don't represent TypeName::Error with TypeCtor |
267 | unreachable!() | 287 | unreachable!() |
268 | } | 288 | } |
@@ -347,6 +367,18 @@ impl ToChalk for Impl { | |||
347 | } | 367 | } |
348 | } | 368 | } |
349 | 369 | ||
370 | impl ToChalk for CallableDef { | ||
371 | type Chalk = FnDefId; | ||
372 | |||
373 | fn to_chalk(self, db: &dyn HirDatabase) -> FnDefId { | ||
374 | db.intern_callable_def(self).into() | ||
375 | } | ||
376 | |||
377 | fn from_chalk(db: &dyn HirDatabase, fn_def_id: FnDefId) -> CallableDef { | ||
378 | db.lookup_intern_callable_def(fn_def_id.into()) | ||
379 | } | ||
380 | } | ||
381 | |||
350 | impl ToChalk for TypeAliasId { | 382 | impl ToChalk for TypeAliasId { |
351 | type Chalk = AssocTypeId; | 383 | type Chalk = AssocTypeId; |
352 | 384 | ||
@@ -479,7 +511,7 @@ where | |||
479 | 511 | ||
480 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Canonical<T::Chalk> { | 512 | fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Canonical<T::Chalk> { |
481 | let parameter = chalk_ir::CanonicalVarKind::new( | 513 | let parameter = chalk_ir::CanonicalVarKind::new( |
482 | chalk_ir::VariableKind::Ty, | 514 | chalk_ir::VariableKind::Ty(chalk_ir::TyKind::General), |
483 | chalk_ir::UniverseIndex::ROOT, | 515 | chalk_ir::UniverseIndex::ROOT, |
484 | ); | 516 | ); |
485 | let value = self.value.to_chalk(db); | 517 | let value = self.value.to_chalk(db); |
@@ -550,17 +582,17 @@ impl ToChalk for builtin::BuiltinImplData { | |||
550 | type Chalk = ImplDatum; | 582 | type Chalk = ImplDatum; |
551 | 583 | ||
552 | fn to_chalk(self, db: &dyn HirDatabase) -> ImplDatum { | 584 | fn to_chalk(self, db: &dyn HirDatabase) -> ImplDatum { |
553 | let impl_type = chalk_rust_ir::ImplType::External; | 585 | let impl_type = rust_ir::ImplType::External; |
554 | let where_clauses = self.where_clauses.into_iter().map(|w| w.to_chalk(db)).collect(); | 586 | let where_clauses = self.where_clauses.into_iter().map(|w| w.to_chalk(db)).collect(); |
555 | 587 | ||
556 | let impl_datum_bound = | 588 | let impl_datum_bound = |
557 | chalk_rust_ir::ImplDatumBound { trait_ref: self.trait_ref.to_chalk(db), where_clauses }; | 589 | rust_ir::ImplDatumBound { trait_ref: self.trait_ref.to_chalk(db), where_clauses }; |
558 | let associated_ty_value_ids = | 590 | let associated_ty_value_ids = |
559 | self.assoc_ty_values.into_iter().map(|v| v.to_chalk(db)).collect(); | 591 | self.assoc_ty_values.into_iter().map(|v| v.to_chalk(db)).collect(); |
560 | chalk_rust_ir::ImplDatum { | 592 | rust_ir::ImplDatum { |
561 | binders: make_binders(impl_datum_bound, self.num_vars), | 593 | binders: make_binders(impl_datum_bound, self.num_vars), |
562 | impl_type, | 594 | impl_type, |
563 | polarity: chalk_rust_ir::Polarity::Positive, | 595 | polarity: rust_ir::Polarity::Positive, |
564 | associated_ty_value_ids, | 596 | associated_ty_value_ids, |
565 | } | 597 | } |
566 | } | 598 | } |
@@ -575,9 +607,9 @@ impl ToChalk for builtin::BuiltinImplAssocTyValueData { | |||
575 | 607 | ||
576 | fn to_chalk(self, db: &dyn HirDatabase) -> AssociatedTyValue { | 608 | fn to_chalk(self, db: &dyn HirDatabase) -> AssociatedTyValue { |
577 | let ty = self.value.to_chalk(db); | 609 | let ty = self.value.to_chalk(db); |
578 | let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty }; | 610 | let value_bound = rust_ir::AssociatedTyValueBound { ty }; |
579 | 611 | ||
580 | chalk_rust_ir::AssociatedTyValue { | 612 | rust_ir::AssociatedTyValue { |
581 | associated_ty_id: self.assoc_ty_id.to_chalk(db), | 613 | associated_ty_id: self.assoc_ty_id.to_chalk(db), |
582 | impl_id: self.impl_.to_chalk(db), | 614 | impl_id: self.impl_.to_chalk(db), |
583 | value: make_binders(value_bound, self.num_vars), | 615 | value: make_binders(value_bound, self.num_vars), |
@@ -599,7 +631,7 @@ where | |||
599 | chalk_ir::Binders::new( | 631 | chalk_ir::Binders::new( |
600 | chalk_ir::VariableKinds::from( | 632 | chalk_ir::VariableKinds::from( |
601 | &Interner, | 633 | &Interner, |
602 | std::iter::repeat(chalk_ir::VariableKind::Ty).take(num_vars), | 634 | std::iter::repeat(chalk_ir::VariableKind::Ty(chalk_ir::TyKind::General)).take(num_vars), |
603 | ), | 635 | ), |
604 | value, | 636 | value, |
605 | ) | 637 | ) |
@@ -626,7 +658,7 @@ pub(super) fn generic_predicate_to_inline_bound( | |||
626 | db: &dyn HirDatabase, | 658 | db: &dyn HirDatabase, |
627 | pred: &GenericPredicate, | 659 | pred: &GenericPredicate, |
628 | self_ty: &Ty, | 660 | self_ty: &Ty, |
629 | ) -> Option<chalk_rust_ir::InlineBound<Interner>> { | 661 | ) -> Option<rust_ir::InlineBound<Interner>> { |
630 | // An InlineBound is like a GenericPredicate, except the self type is left out. | 662 | // An InlineBound is like a GenericPredicate, except the self type is left out. |
631 | // We don't have a special type for this, but Chalk does. | 663 | // We don't have a special type for this, but Chalk does. |
632 | match pred { | 664 | match pred { |
@@ -641,8 +673,8 @@ pub(super) fn generic_predicate_to_inline_bound( | |||
641 | .map(|ty| ty.clone().to_chalk(db).cast(&Interner)) | 673 | .map(|ty| ty.clone().to_chalk(db).cast(&Interner)) |
642 | .collect(); | 674 | .collect(); |
643 | let trait_bound = | 675 | let trait_bound = |
644 | chalk_rust_ir::TraitBound { trait_id: trait_ref.trait_.to_chalk(db), args_no_self }; | 676 | rust_ir::TraitBound { trait_id: trait_ref.trait_.to_chalk(db), args_no_self }; |
645 | Some(chalk_rust_ir::InlineBound::TraitBound(trait_bound)) | 677 | Some(rust_ir::InlineBound::TraitBound(trait_bound)) |
646 | } | 678 | } |
647 | GenericPredicate::Projection(proj) => { | 679 | GenericPredicate::Projection(proj) => { |
648 | if &proj.projection_ty.parameters[0] != self_ty { | 680 | if &proj.projection_ty.parameters[0] != self_ty { |
@@ -656,16 +688,13 @@ pub(super) fn generic_predicate_to_inline_bound( | |||
656 | .iter() | 688 | .iter() |
657 | .map(|ty| ty.clone().to_chalk(db).cast(&Interner)) | 689 | .map(|ty| ty.clone().to_chalk(db).cast(&Interner)) |
658 | .collect(); | 690 | .collect(); |
659 | let alias_eq_bound = chalk_rust_ir::AliasEqBound { | 691 | let alias_eq_bound = rust_ir::AliasEqBound { |
660 | value: proj.ty.clone().to_chalk(db), | 692 | value: proj.ty.clone().to_chalk(db), |
661 | trait_bound: chalk_rust_ir::TraitBound { | 693 | trait_bound: rust_ir::TraitBound { trait_id: trait_.to_chalk(db), args_no_self }, |
662 | trait_id: trait_.to_chalk(db), | ||
663 | args_no_self, | ||
664 | }, | ||
665 | associated_ty_id: proj.projection_ty.associated_ty.to_chalk(db), | 694 | associated_ty_id: proj.projection_ty.associated_ty.to_chalk(db), |
666 | parameters: Vec::new(), // FIXME we don't support generic associated types yet | 695 | parameters: Vec::new(), // FIXME we don't support generic associated types yet |
667 | }; | 696 | }; |
668 | Some(chalk_rust_ir::InlineBound::AliasEqBound(alias_eq_bound)) | 697 | Some(rust_ir::InlineBound::AliasEqBound(alias_eq_bound)) |
669 | } | 698 | } |
670 | GenericPredicate::Error => None, | 699 | GenericPredicate::Error => None, |
671 | } | 700 | } |
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( |