diff options
author | Florian Diebold <[email protected]> | 2019-04-20 11:34:36 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-05-04 17:18:30 +0100 |
commit | b9c0c2abb79769852119dc9a595e63ee74eeba03 (patch) | |
tree | 39bf8f14438771f20337eaf57c421aebe3e7dfdb /crates/ra_hir/src/ids.rs | |
parent | 6269791d3626b9a9e5ea6a11c15e14470c0809a0 (diff) |
Chalk integration
- add proper canonicalization logic
- add conversions from/to Chalk IR
Diffstat (limited to 'crates/ra_hir/src/ids.rs')
-rw-r--r-- | crates/ra_hir/src/ids.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index 4102951c9..6875b006d 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs | |||
@@ -323,6 +323,25 @@ impl AstItemDef<ast::TraitDef> for TraitId { | |||
323 | } | 323 | } |
324 | } | 324 | } |
325 | 325 | ||
326 | fn from_chalk<T: salsa::InternKey>(chalk_id: chalk_ir::RawId) -> T { | ||
327 | T::from_intern_id(salsa::InternId::from(chalk_id.index)) | ||
328 | } | ||
329 | fn to_chalk<T: salsa::InternKey>(salsa_id: T) -> chalk_ir::RawId { | ||
330 | chalk_ir::RawId { index: salsa_id.as_intern_id().as_u32() } | ||
331 | } | ||
332 | |||
333 | impl From<chalk_ir::TraitId> for TraitId { | ||
334 | fn from(trait_id: chalk_ir::TraitId) -> Self { | ||
335 | from_chalk(trait_id.0) | ||
336 | } | ||
337 | } | ||
338 | |||
339 | impl From<TraitId> for chalk_ir::TraitId { | ||
340 | fn from(trait_id: TraitId) -> Self { | ||
341 | chalk_ir::TraitId(to_chalk(trait_id)) | ||
342 | } | ||
343 | } | ||
344 | |||
326 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 345 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
327 | pub struct TypeAliasId(salsa::InternId); | 346 | pub struct TypeAliasId(salsa::InternId); |
328 | impl_intern_key!(TypeAliasId); | 347 | impl_intern_key!(TypeAliasId); |
@@ -354,3 +373,38 @@ impl MacroCallId { | |||
354 | ) | 373 | ) |
355 | } | 374 | } |
356 | } | 375 | } |
376 | |||
377 | /// This exists just for chalk, because chalk doesn't differentiate between | ||
378 | /// enums and structs. | ||
379 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
380 | pub struct TypeCtorId(salsa::InternId); | ||
381 | impl_intern_key!(TypeCtorId); | ||
382 | |||
383 | impl From<chalk_ir::StructId> for TypeCtorId { | ||
384 | fn from(struct_id: chalk_ir::StructId) -> Self { | ||
385 | from_chalk(struct_id.0) | ||
386 | } | ||
387 | } | ||
388 | |||
389 | impl From<TypeCtorId> for chalk_ir::StructId { | ||
390 | fn from(adt_id: TypeCtorId) -> Self { | ||
391 | chalk_ir::StructId(to_chalk(adt_id)) | ||
392 | } | ||
393 | } | ||
394 | |||
395 | /// This exists just for chalk, because our ImplIds are only unique per module. | ||
396 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
397 | pub struct GlobalImplId(salsa::InternId); | ||
398 | impl_intern_key!(GlobalImplId); | ||
399 | |||
400 | impl From<chalk_ir::ImplId> for GlobalImplId { | ||
401 | fn from(impl_id: chalk_ir::ImplId) -> Self { | ||
402 | from_chalk(impl_id.0) | ||
403 | } | ||
404 | } | ||
405 | |||
406 | impl From<GlobalImplId> for chalk_ir::ImplId { | ||
407 | fn from(impl_id: GlobalImplId) -> Self { | ||
408 | chalk_ir::ImplId(to_chalk(impl_id)) | ||
409 | } | ||
410 | } | ||