diff options
-rw-r--r-- | crates/hir_ty/src/db.rs | 6 | ||||
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 3 | ||||
-rw-r--r-- | crates/hir_ty/src/lib.rs | 14 | ||||
-rw-r--r-- | crates/hir_ty/src/traits/chalk.rs | 6 | ||||
-rw-r--r-- | crates/hir_ty/src/traits/chalk/mapping.rs | 11 |
5 files changed, 17 insertions, 23 deletions
diff --git a/crates/hir_ty/src/db.rs b/crates/hir_ty/src/db.rs index a038674cf..1b59616ba 100644 --- a/crates/hir_ty/src/db.rs +++ b/crates/hir_ty/src/db.rs | |||
@@ -85,7 +85,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> { | |||
85 | #[salsa::interned] | 85 | #[salsa::interned] |
86 | fn intern_impl_trait_id(&self, id: OpaqueTyId) -> InternedOpaqueTyId; | 86 | fn intern_impl_trait_id(&self, id: OpaqueTyId) -> InternedOpaqueTyId; |
87 | #[salsa::interned] | 87 | #[salsa::interned] |
88 | fn intern_closure(&self, id: (DefWithBodyId, ExprId)) -> ClosureId; | 88 | fn intern_closure(&self, id: (DefWithBodyId, ExprId)) -> InternedClosureId; |
89 | 89 | ||
90 | #[salsa::invoke(chalk::associated_ty_data_query)] | 90 | #[salsa::invoke(chalk::associated_ty_data_query)] |
91 | fn associated_ty_data(&self, id: chalk::AssocTypeId) -> Arc<chalk::AssociatedTyDatum>; | 91 | fn associated_ty_data(&self, id: chalk::AssocTypeId) -> Arc<chalk::AssociatedTyDatum>; |
@@ -157,8 +157,8 @@ pub struct InternedOpaqueTyId(salsa::InternId); | |||
157 | impl_intern_key!(InternedOpaqueTyId); | 157 | impl_intern_key!(InternedOpaqueTyId); |
158 | 158 | ||
159 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 159 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
160 | pub struct ClosureId(salsa::InternId); | 160 | pub struct InternedClosureId(salsa::InternId); |
161 | impl_intern_key!(ClosureId); | 161 | impl_intern_key!(InternedClosureId); |
162 | 162 | ||
163 | /// This exists just for Chalk, because Chalk just has a single `FnDefId` where | 163 | /// This exists just for Chalk, because Chalk just has a single `FnDefId` where |
164 | /// we have different IDs for struct and enum variant constructors. | 164 | /// we have different IDs for struct and enum variant constructors. |
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 153f22f25..2e21d796c 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -264,8 +264,9 @@ impl<'a> InferenceContext<'a> { | |||
264 | substs: Substs(sig_tys.clone().into()), | 264 | substs: Substs(sig_tys.clone().into()), |
265 | }) | 265 | }) |
266 | .intern(&Interner); | 266 | .intern(&Interner); |
267 | let closure_id = self.db.intern_closure((self.owner, tgt_expr)).into(); | ||
267 | let closure_ty = | 268 | let closure_ty = |
268 | TyKind::Closure(self.owner, tgt_expr, Substs::single(sig_ty)).intern(&Interner); | 269 | TyKind::Closure(closure_id, Substs::single(sig_ty)).intern(&Interner); |
269 | 270 | ||
270 | // Eagerly try to relate the closure type with the expected | 271 | // Eagerly try to relate the closure type with the expected |
271 | // type, otherwise we often won't have enough information to | 272 | // type, otherwise we often won't have enough information to |
diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs index 6b3485264..ec2010e4b 100644 --- a/crates/hir_ty/src/lib.rs +++ b/crates/hir_ty/src/lib.rs | |||
@@ -27,9 +27,8 @@ use std::{iter, mem, ops::Deref, sync::Arc}; | |||
27 | 27 | ||
28 | use base_db::salsa; | 28 | use base_db::salsa; |
29 | use hir_def::{ | 29 | use hir_def::{ |
30 | builtin_type::BuiltinType, expr::ExprId, type_ref::Rawness, AssocContainerId, DefWithBodyId, | 30 | builtin_type::BuiltinType, expr::ExprId, type_ref::Rawness, AssocContainerId, FunctionId, |
31 | FunctionId, GenericDefId, HasModule, LifetimeParamId, Lookup, TraitId, TypeAliasId, | 31 | GenericDefId, HasModule, LifetimeParamId, Lookup, TraitId, TypeAliasId, TypeParamId, |
32 | TypeParamId, | ||
33 | }; | 32 | }; |
34 | use itertools::Itertools; | 33 | use itertools::Itertools; |
35 | 34 | ||
@@ -53,7 +52,8 @@ pub use crate::traits::chalk::Interner; | |||
53 | 52 | ||
54 | pub type ForeignDefId = chalk_ir::ForeignDefId<Interner>; | 53 | pub type ForeignDefId = chalk_ir::ForeignDefId<Interner>; |
55 | pub type AssocTypeId = chalk_ir::AssocTypeId<Interner>; | 54 | pub type AssocTypeId = chalk_ir::AssocTypeId<Interner>; |
56 | pub(crate) type FnDefId = chalk_ir::FnDefId<Interner>; | 55 | pub type FnDefId = chalk_ir::FnDefId<Interner>; |
56 | pub type ClosureId = chalk_ir::ClosureId<Interner>; | ||
57 | 57 | ||
58 | #[derive(Clone, PartialEq, Eq, Debug, Hash)] | 58 | #[derive(Clone, PartialEq, Eq, Debug, Hash)] |
59 | pub enum Lifetime { | 59 | pub enum Lifetime { |
@@ -195,7 +195,7 @@ pub enum TyKind { | |||
195 | /// | 195 | /// |
196 | /// The closure signature is stored in a `FnPtr` type in the first type | 196 | /// The closure signature is stored in a `FnPtr` type in the first type |
197 | /// parameter. | 197 | /// parameter. |
198 | Closure(DefWithBodyId, ExprId, Substs), | 198 | Closure(ClosureId, Substs), |
199 | 199 | ||
200 | /// Represents a foreign type declared in external blocks. | 200 | /// Represents a foreign type declared in external blocks. |
201 | ForeignType(ForeignDefId), | 201 | ForeignType(ForeignDefId), |
@@ -734,9 +734,7 @@ impl Ty { | |||
734 | ty_id == ty_id2 | 734 | ty_id == ty_id2 |
735 | } | 735 | } |
736 | (TyKind::ForeignType(ty_id, ..), TyKind::ForeignType(ty_id2, ..)) => ty_id == ty_id2, | 736 | (TyKind::ForeignType(ty_id, ..), TyKind::ForeignType(ty_id2, ..)) => ty_id == ty_id2, |
737 | (TyKind::Closure(def, expr, _), TyKind::Closure(def2, expr2, _)) => { | 737 | (TyKind::Closure(id1, _), TyKind::Closure(id2, _)) => id1 == id2, |
738 | expr == expr2 && def == def2 | ||
739 | } | ||
740 | (TyKind::Ref(mutability, ..), TyKind::Ref(mutability2, ..)) | 738 | (TyKind::Ref(mutability, ..), TyKind::Ref(mutability2, ..)) |
741 | | (TyKind::Raw(mutability, ..), TyKind::Raw(mutability2, ..)) => { | 739 | | (TyKind::Raw(mutability, ..), TyKind::Raw(mutability2, ..)) => { |
742 | mutability == mutability2 | 740 | mutability == mutability2 |
diff --git a/crates/hir_ty/src/traits/chalk.rs b/crates/hir_ty/src/traits/chalk.rs index bb92d8e2a..e7217bc11 100644 --- a/crates/hir_ty/src/traits/chalk.rs +++ b/crates/hir_ty/src/traits/chalk.rs | |||
@@ -716,14 +716,14 @@ impl From<crate::db::InternedOpaqueTyId> for OpaqueTyId { | |||
716 | } | 716 | } |
717 | } | 717 | } |
718 | 718 | ||
719 | impl From<chalk_ir::ClosureId<Interner>> for crate::db::ClosureId { | 719 | impl From<chalk_ir::ClosureId<Interner>> for crate::db::InternedClosureId { |
720 | fn from(id: chalk_ir::ClosureId<Interner>) -> Self { | 720 | fn from(id: chalk_ir::ClosureId<Interner>) -> Self { |
721 | Self::from_intern_id(id.0) | 721 | Self::from_intern_id(id.0) |
722 | } | 722 | } |
723 | } | 723 | } |
724 | 724 | ||
725 | impl From<crate::db::ClosureId> for chalk_ir::ClosureId<Interner> { | 725 | impl From<crate::db::InternedClosureId> for chalk_ir::ClosureId<Interner> { |
726 | fn from(id: crate::db::ClosureId) -> Self { | 726 | fn from(id: crate::db::InternedClosureId) -> Self { |
727 | chalk_ir::ClosureId(id.as_intern_id()) | 727 | chalk_ir::ClosureId(id.as_intern_id()) |
728 | } | 728 | } |
729 | } | 729 | } |
diff --git a/crates/hir_ty/src/traits/chalk/mapping.rs b/crates/hir_ty/src/traits/chalk/mapping.rs index 23ef07d77..56a30363b 100644 --- a/crates/hir_ty/src/traits/chalk/mapping.rs +++ b/crates/hir_ty/src/traits/chalk/mapping.rs | |||
@@ -72,10 +72,9 @@ impl ToChalk for Ty { | |||
72 | } | 72 | } |
73 | TyKind::Never => chalk_ir::TyKind::Never.intern(&Interner), | 73 | TyKind::Never => chalk_ir::TyKind::Never.intern(&Interner), |
74 | 74 | ||
75 | TyKind::Closure(def, expr, substs) => { | 75 | TyKind::Closure(closure_id, substs) => { |
76 | let closure_id = db.intern_closure((def, expr)); | ||
77 | let substitution = substs.to_chalk(db); | 76 | let substitution = substs.to_chalk(db); |
78 | chalk_ir::TyKind::Closure(closure_id.into(), substitution).intern(&Interner) | 77 | chalk_ir::TyKind::Closure(closure_id, substitution).intern(&Interner) |
79 | } | 78 | } |
80 | 79 | ||
81 | TyKind::Adt(adt_id, substs) => { | 80 | TyKind::Adt(adt_id, substs) => { |
@@ -203,11 +202,7 @@ impl ToChalk for Ty { | |||
203 | TyKind::FnDef(fn_def_id, from_chalk(db, subst)) | 202 | TyKind::FnDef(fn_def_id, from_chalk(db, subst)) |
204 | } | 203 | } |
205 | 204 | ||
206 | chalk_ir::TyKind::Closure(id, subst) => { | 205 | 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 | 206 | ||
212 | chalk_ir::TyKind::Foreign(foreign_def_id) => TyKind::ForeignType(foreign_def_id), | 207 | chalk_ir::TyKind::Foreign(foreign_def_id) => TyKind::ForeignType(foreign_def_id), |
213 | chalk_ir::TyKind::Generator(_, _) => unimplemented!(), // FIXME | 208 | chalk_ir::TyKind::Generator(_, _) => unimplemented!(), // FIXME |