aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2021-03-13 16:36:07 +0000
committerFlorian Diebold <[email protected]>2021-03-13 16:56:48 +0000
commit19664e276aba21a42cad5351a2c91995d1ce5d52 (patch)
tree34a0c9ed9c374605f59ab839a5c8193b440c7a2a
parentdfafcd926a4cc9b09aba0eb3cc5275a4abe633b9 (diff)
Use chalk_ir::AssocTypeId
-rw-r--r--crates/hir/src/lib.rs7
-rw-r--r--crates/hir_ty/src/autoderef.rs3
-rw-r--r--crates/hir_ty/src/display.rs28
-rw-r--r--crates/hir_ty/src/infer.rs7
-rw-r--r--crates/hir_ty/src/infer/expr.rs7
-rw-r--r--crates/hir_ty/src/lib.rs28
-rw-r--r--crates/hir_ty/src/lower.rs10
-rw-r--r--crates/hir_ty/src/traits/chalk.rs17
-rw-r--r--crates/hir_ty/src/traits/chalk/mapping.rs47
-rw-r--r--crates/hir_ty/src/traits/chalk/tls.rs9
10 files changed, 87 insertions, 76 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 7b9de11ed..f15fb1a82 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -51,7 +51,7 @@ use hir_expand::{diagnostics::DiagnosticSink, name::name, MacroDefKind};
51use hir_ty::{ 51use hir_ty::{
52 autoderef, 52 autoderef,
53 display::{write_bounds_like_dyn_trait_with_prefix, HirDisplayError, HirFormatter}, 53 display::{write_bounds_like_dyn_trait_with_prefix, HirDisplayError, HirFormatter},
54 method_resolution, 54 method_resolution, to_assoc_type_id,
55 traits::{FnTrait, Solution, SolutionVariables}, 55 traits::{FnTrait, Solution, SolutionVariables},
56 AliasTy, BoundVar, CallableDefId, CallableSig, Canonical, DebruijnIndex, GenericPredicate, 56 AliasTy, BoundVar, CallableDefId, CallableSig, Canonical, DebruijnIndex, GenericPredicate,
57 InEnvironment, Interner, Obligation, ProjectionPredicate, ProjectionTy, Scalar, Substs, 57 InEnvironment, Interner, Obligation, ProjectionPredicate, ProjectionTy, Scalar, Substs,
@@ -1683,7 +1683,10 @@ impl Type {
1683 .fill(args.iter().map(|t| t.ty.value.clone())) 1683 .fill(args.iter().map(|t| t.ty.value.clone()))
1684 .build(); 1684 .build();
1685 let predicate = ProjectionPredicate { 1685 let predicate = ProjectionPredicate {
1686 projection_ty: ProjectionTy { associated_ty: alias.id, parameters: subst }, 1686 projection_ty: ProjectionTy {
1687 associated_ty: to_assoc_type_id(alias.id),
1688 parameters: subst,
1689 },
1687 ty: TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)).intern(&Interner), 1690 ty: TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)).intern(&Interner),
1688 }; 1691 };
1689 let goal = Canonical { 1692 let goal = Canonical {
diff --git a/crates/hir_ty/src/autoderef.rs b/crates/hir_ty/src/autoderef.rs
index 09009a3d8..d739d5d60 100644
--- a/crates/hir_ty/src/autoderef.rs
+++ b/crates/hir_ty/src/autoderef.rs
@@ -12,6 +12,7 @@ use log::{info, warn};
12 12
13use crate::{ 13use crate::{
14 db::HirDatabase, 14 db::HirDatabase,
15 to_assoc_type_id,
15 traits::{InEnvironment, Solution}, 16 traits::{InEnvironment, Solution},
16 utils::generics, 17 utils::generics,
17 BoundVar, Canonical, DebruijnIndex, Interner, Obligation, Substs, TraitRef, Ty, TyKind, 18 BoundVar, Canonical, DebruijnIndex, Interner, Obligation, Substs, TraitRef, Ty, TyKind,
@@ -83,7 +84,7 @@ fn deref_by_trait(
83 let projection = super::traits::ProjectionPredicate { 84 let projection = super::traits::ProjectionPredicate {
84 ty: TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, ty.value.kinds.len())) 85 ty: TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, ty.value.kinds.len()))
85 .intern(&Interner), 86 .intern(&Interner),
86 projection_ty: super::ProjectionTy { associated_ty: target, parameters }, 87 projection_ty: super::ProjectionTy { associated_ty: to_assoc_type_id(target), parameters },
87 }; 88 };
88 89
89 let obligation = super::Obligation::Projection(projection); 90 let obligation = super::Obligation::Projection(projection);
diff --git a/crates/hir_ty/src/display.rs b/crates/hir_ty/src/display.rs
index 9b1e2ad05..2022069d8 100644
--- a/crates/hir_ty/src/display.rs
+++ b/crates/hir_ty/src/display.rs
@@ -11,9 +11,9 @@ use hir_def::{
11use hir_expand::name::Name; 11use hir_expand::name::Name;
12 12
13use crate::{ 13use crate::{
14 db::HirDatabase, from_foreign_def_id, primitive, utils::generics, AdtId, AliasTy, 14 db::HirDatabase, from_assoc_type_id, from_foreign_def_id, primitive, to_assoc_type_id,
15 CallableDefId, CallableSig, GenericPredicate, Interner, Lifetime, Obligation, OpaqueTy, 15 utils::generics, AdtId, AliasTy, CallableDefId, CallableSig, GenericPredicate, Interner,
16 OpaqueTyId, ProjectionTy, Scalar, Substs, TraitRef, Ty, TyKind, 16 Lifetime, Obligation, OpaqueTy, OpaqueTyId, ProjectionTy, Scalar, Substs, TraitRef, Ty, TyKind,
17}; 17};
18 18
19pub struct HirFormatter<'a> { 19pub struct HirFormatter<'a> {
@@ -256,7 +256,7 @@ impl HirDisplay for ProjectionTy {
256 f.write_joined(&self.parameters[1..], ", ")?; 256 f.write_joined(&self.parameters[1..], ", ")?;
257 write!(f, ">")?; 257 write!(f, ">")?;
258 } 258 }
259 write!(f, ">::{}", f.db.type_alias_data(self.associated_ty).name)?; 259 write!(f, ">::{}", f.db.type_alias_data(from_assoc_type_id(self.associated_ty)).name)?;
260 Ok(()) 260 Ok(())
261 } 261 }
262} 262}
@@ -467,13 +467,14 @@ impl HirDisplay for Ty {
467 } 467 }
468 } 468 }
469 } 469 }
470 TyKind::AssociatedType(type_alias, parameters) => { 470 TyKind::AssociatedType(assoc_type_id, parameters) => {
471 let type_alias = from_assoc_type_id(*assoc_type_id);
471 let trait_ = match type_alias.lookup(f.db.upcast()).container { 472 let trait_ = match type_alias.lookup(f.db.upcast()).container {
472 AssocContainerId::TraitId(it) => it, 473 AssocContainerId::TraitId(it) => it,
473 _ => panic!("not an associated type"), 474 _ => panic!("not an associated type"),
474 }; 475 };
475 let trait_ = f.db.trait_data(trait_); 476 let trait_ = f.db.trait_data(trait_);
476 let type_alias_data = f.db.type_alias_data(*type_alias); 477 let type_alias_data = f.db.type_alias_data(type_alias);
477 478
478 // Use placeholder associated types when the target is test (https://rust-lang.github.io/chalk/book/clauses/type_equality.html#placeholder-associated-types) 479 // Use placeholder associated types when the target is test (https://rust-lang.github.io/chalk/book/clauses/type_equality.html#placeholder-associated-types)
479 if f.display_target.is_test() { 480 if f.display_target.is_test() {
@@ -484,8 +485,10 @@ impl HirDisplay for Ty {
484 write!(f, ">")?; 485 write!(f, ">")?;
485 } 486 }
486 } else { 487 } else {
487 let projection_ty = 488 let projection_ty = ProjectionTy {
488 ProjectionTy { associated_ty: *type_alias, parameters: parameters.clone() }; 489 associated_ty: to_assoc_type_id(type_alias),
490 parameters: parameters.clone(),
491 };
489 492
490 projection_ty.hir_fmt(f)?; 493 projection_ty.hir_fmt(f)?;
491 } 494 }
@@ -697,7 +700,9 @@ fn write_bounds_like_dyn_trait(
697 write!(f, "<")?; 700 write!(f, "<")?;
698 angle_open = true; 701 angle_open = true;
699 } 702 }
700 let type_alias = f.db.type_alias_data(projection_pred.projection_ty.associated_ty); 703 let type_alias = f.db.type_alias_data(from_assoc_type_id(
704 projection_pred.projection_ty.associated_ty,
705 ));
701 write!(f, "{} = ", type_alias.name)?; 706 write!(f, "{} = ", type_alias.name)?;
702 projection_pred.ty.hir_fmt(f)?; 707 projection_pred.ty.hir_fmt(f)?;
703 } 708 }
@@ -768,7 +773,10 @@ impl HirDisplay for GenericPredicate {
768 write!( 773 write!(
769 f, 774 f,
770 ">::{} = ", 775 ">::{} = ",
771 f.db.type_alias_data(projection_pred.projection_ty.associated_ty).name, 776 f.db.type_alias_data(from_assoc_type_id(
777 projection_pred.projection_ty.associated_ty
778 ))
779 .name,
772 )?; 780 )?;
773 projection_pred.ty.hir_fmt(f)?; 781 projection_pred.ty.hir_fmt(f)?;
774 } 782 }
diff --git a/crates/hir_ty/src/infer.rs b/crates/hir_ty/src/infer.rs
index acde99b04..9d9bf549c 100644
--- a/crates/hir_ty/src/infer.rs
+++ b/crates/hir_ty/src/infer.rs
@@ -42,7 +42,7 @@ use super::{
42}; 42};
43use crate::{ 43use crate::{
44 db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode, 44 db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode,
45 AliasTy, Interner, TyKind, 45 to_assoc_type_id, AliasTy, Interner, TyKind,
46}; 46};
47 47
48pub(crate) use unify::unify; 48pub(crate) use unify::unify;
@@ -382,7 +382,10 @@ impl<'a> InferenceContext<'a> {
382 let trait_ref = TraitRef { trait_, substs: substs.clone() }; 382 let trait_ref = TraitRef { trait_, substs: substs.clone() };
383 let projection = ProjectionPredicate { 383 let projection = ProjectionPredicate {
384 ty: ty.clone(), 384 ty: ty.clone(),
385 projection_ty: ProjectionTy { associated_ty: res_assoc_ty, parameters: substs }, 385 projection_ty: ProjectionTy {
386 associated_ty: to_assoc_type_id(res_assoc_ty),
387 parameters: substs,
388 },
386 }; 389 };
387 self.obligations.push(Obligation::Trait(trait_ref)); 390 self.obligations.push(Obligation::Trait(trait_ref));
388 self.obligations.push(Obligation::Projection(projection)); 391 self.obligations.push(Obligation::Projection(projection));
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs
index 4e77f22fd..a72424dc7 100644
--- a/crates/hir_ty/src/infer/expr.rs
+++ b/crates/hir_ty/src/infer/expr.rs
@@ -18,6 +18,7 @@ use crate::{
18 lower::lower_to_chalk_mutability, 18 lower::lower_to_chalk_mutability,
19 method_resolution, op, 19 method_resolution, op,
20 primitive::{self, UintTy}, 20 primitive::{self, UintTy},
21 to_assoc_type_id,
21 traits::{FnTrait, InEnvironment}, 22 traits::{FnTrait, InEnvironment},
22 utils::{generics, variant_data, Generics}, 23 utils::{generics, variant_data, Generics},
23 AdtId, Binders, CallableDefId, FnPointer, FnSig, Interner, Obligation, OpaqueTyId, Rawness, 24 AdtId, Binders, CallableDefId, FnPointer, FnSig, Interner, Obligation, OpaqueTyId, Rawness,
@@ -97,8 +98,10 @@ impl<'a> InferenceContext<'a> {
97 }); 98 });
98 if self.db.trait_solve(krate, goal.value).is_some() { 99 if self.db.trait_solve(krate, goal.value).is_some() {
99 self.obligations.push(implements_fn_trait); 100 self.obligations.push(implements_fn_trait);
100 let output_proj_ty = 101 let output_proj_ty = crate::ProjectionTy {
101 crate::ProjectionTy { associated_ty: output_assoc_type, parameters: substs }; 102 associated_ty: to_assoc_type_id(output_assoc_type),
103 parameters: substs,
104 };
102 let return_ty = self.normalize_projection_ty(output_proj_ty); 105 let return_ty = self.normalize_projection_ty(output_proj_ty);
103 Some((arg_tys, return_ty)) 106 Some((arg_tys, return_ty))
104 } else { 107 } else {
diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs
index 94cbb21ca..5752ddc4e 100644
--- a/crates/hir_ty/src/lib.rs
+++ b/crates/hir_ty/src/lib.rs
@@ -52,6 +52,7 @@ pub use chalk_ir::{AdtId, BoundVar, DebruijnIndex, Mutability, Scalar, TyVariabl
52pub use crate::traits::chalk::Interner; 52pub use crate::traits::chalk::Interner;
53 53
54pub type ForeignDefId = chalk_ir::ForeignDefId<Interner>; 54pub type ForeignDefId = chalk_ir::ForeignDefId<Interner>;
55pub type AssocTypeId = chalk_ir::AssocTypeId<Interner>;
55 56
56#[derive(Clone, PartialEq, Eq, Debug, Hash)] 57#[derive(Clone, PartialEq, Eq, Debug, Hash)]
57pub enum Lifetime { 58pub enum Lifetime {
@@ -70,7 +71,7 @@ pub struct OpaqueTy {
70/// trait and all its parameters are fully known. 71/// trait and all its parameters are fully known.
71#[derive(Clone, PartialEq, Eq, Debug, Hash)] 72#[derive(Clone, PartialEq, Eq, Debug, Hash)]
72pub struct ProjectionTy { 73pub struct ProjectionTy {
73 pub associated_ty: TypeAliasId, 74 pub associated_ty: AssocTypeId,
74 pub parameters: Substs, 75 pub parameters: Substs,
75} 76}
76 77
@@ -80,7 +81,7 @@ impl ProjectionTy {
80 } 81 }
81 82
82 fn trait_(&self, db: &dyn HirDatabase) -> TraitId { 83 fn trait_(&self, db: &dyn HirDatabase) -> TraitId {
83 match self.associated_ty.lookup(db.upcast()).container { 84 match from_assoc_type_id(self.associated_ty).lookup(db.upcast()).container {
84 AssocContainerId::TraitId(it) => it, 85 AssocContainerId::TraitId(it) => it,
85 _ => panic!("projection ty without parent trait"), 86 _ => panic!("projection ty without parent trait"),
86 } 87 }
@@ -141,7 +142,7 @@ pub enum TyKind {
141 /// when we have tried to normalize a projection like `T::Item` but 142 /// when we have tried to normalize a projection like `T::Item` but
142 /// couldn't find a better representation. In that case, we generate 143 /// couldn't find a better representation. In that case, we generate
143 /// an **application type** like `(Iterator::Item)<T>`. 144 /// an **application type** like `(Iterator::Item)<T>`.
144 AssociatedType(TypeAliasId, Substs), 145 AssociatedType(AssocTypeId, Substs),
145 146
146 /// a scalar type like `bool` or `u32` 147 /// a scalar type like `bool` or `u32`
147 Scalar(Scalar), 148 Scalar(Scalar),
@@ -706,7 +707,7 @@ impl Ty {
706 match *self.interned(&Interner) { 707 match *self.interned(&Interner) {
707 TyKind::Adt(AdtId(adt), ..) => Some(adt.into()), 708 TyKind::Adt(AdtId(adt), ..) => Some(adt.into()),
708 TyKind::FnDef(callable, ..) => Some(callable.into()), 709 TyKind::FnDef(callable, ..) => Some(callable.into()),
709 TyKind::AssociatedType(type_alias, ..) => Some(type_alias.into()), 710 TyKind::AssociatedType(type_alias, ..) => Some(from_assoc_type_id(type_alias).into()),
710 TyKind::ForeignType(type_alias, ..) => Some(from_foreign_def_id(type_alias).into()), 711 TyKind::ForeignType(type_alias, ..) => Some(from_foreign_def_id(type_alias).into()),
711 _ => None, 712 _ => None,
712 } 713 }
@@ -920,14 +921,15 @@ impl Ty {
920 921
921 pub fn associated_type_parent_trait(&self, db: &dyn HirDatabase) -> Option<TraitId> { 922 pub fn associated_type_parent_trait(&self, db: &dyn HirDatabase) -> Option<TraitId> {
922 match self.interned(&Interner) { 923 match self.interned(&Interner) {
923 TyKind::AssociatedType(type_alias_id, ..) => { 924 TyKind::AssociatedType(id, ..) => {
924 match type_alias_id.lookup(db.upcast()).container { 925 match from_assoc_type_id(*id).lookup(db.upcast()).container {
925 AssocContainerId::TraitId(trait_id) => Some(trait_id), 926 AssocContainerId::TraitId(trait_id) => Some(trait_id),
926 _ => None, 927 _ => None,
927 } 928 }
928 } 929 }
929 TyKind::Alias(AliasTy::Projection(projection_ty)) => { 930 TyKind::Alias(AliasTy::Projection(projection_ty)) => {
930 match projection_ty.associated_ty.lookup(db.upcast()).container { 931 match from_assoc_type_id(projection_ty.associated_ty).lookup(db.upcast()).container
932 {
931 AssocContainerId::TraitId(trait_id) => Some(trait_id), 933 AssocContainerId::TraitId(trait_id) => Some(trait_id),
932 _ => None, 934 _ => None,
933 } 935 }
@@ -1121,10 +1123,18 @@ pub(crate) struct ReturnTypeImplTrait {
1121 pub(crate) bounds: Binders<Vec<GenericPredicate>>, 1123 pub(crate) bounds: Binders<Vec<GenericPredicate>>,
1122} 1124}
1123 1125
1124pub(crate) fn to_foreign_def_id(id: TypeAliasId) -> chalk_ir::ForeignDefId<Interner> { 1126pub fn to_foreign_def_id(id: TypeAliasId) -> ForeignDefId {
1125 chalk_ir::ForeignDefId(salsa::InternKey::as_intern_id(&id)) 1127 chalk_ir::ForeignDefId(salsa::InternKey::as_intern_id(&id))
1126} 1128}
1127 1129
1128pub(crate) fn from_foreign_def_id(id: chalk_ir::ForeignDefId<Interner>) -> TypeAliasId { 1130pub fn from_foreign_def_id(id: ForeignDefId) -> TypeAliasId {
1131 salsa::InternKey::from_intern_id(id.0)
1132}
1133
1134pub fn to_assoc_type_id(id: TypeAliasId) -> AssocTypeId {
1135 chalk_ir::AssocTypeId(salsa::InternKey::as_intern_id(&id))
1136}
1137
1138pub fn from_assoc_type_id(id: AssocTypeId) -> TypeAliasId {
1129 salsa::InternKey::from_intern_id(id.0) 1139 salsa::InternKey::from_intern_id(id.0)
1130} 1140}
diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs
index a35d7266d..a5ab1ff70 100644
--- a/crates/hir_ty/src/lower.rs
+++ b/crates/hir_ty/src/lower.rs
@@ -27,6 +27,7 @@ use stdx::impl_from;
27 27
28use crate::{ 28use crate::{
29 db::HirDatabase, 29 db::HirDatabase,
30 to_assoc_type_id,
30 traits::chalk::{Interner, ToChalk}, 31 traits::chalk::{Interner, ToChalk},
31 utils::{ 32 utils::{
32 all_super_trait_refs, associated_type_by_name_including_super_traits, generics, 33 all_super_trait_refs, associated_type_by_name_including_super_traits, generics,
@@ -358,7 +359,7 @@ impl Ty {
358 Some((super_trait_ref, associated_ty)) => { 359 Some((super_trait_ref, associated_ty)) => {
359 // FIXME handle type parameters on the segment 360 // FIXME handle type parameters on the segment
360 TyKind::Alias(AliasTy::Projection(ProjectionTy { 361 TyKind::Alias(AliasTy::Projection(ProjectionTy {
361 associated_ty, 362 associated_ty: to_assoc_type_id(associated_ty),
362 parameters: super_trait_ref.substs, 363 parameters: super_trait_ref.substs,
363 })) 364 }))
364 .intern(&Interner) 365 .intern(&Interner)
@@ -487,7 +488,7 @@ impl Ty {
487 // FIXME handle type parameters on the segment 488 // FIXME handle type parameters on the segment
488 return Some( 489 return Some(
489 TyKind::Alias(AliasTy::Projection(ProjectionTy { 490 TyKind::Alias(AliasTy::Projection(ProjectionTy {
490 associated_ty, 491 associated_ty: to_assoc_type_id(associated_ty),
491 parameters: substs, 492 parameters: substs,
492 })) 493 }))
493 .intern(&Interner), 494 .intern(&Interner),
@@ -753,7 +754,10 @@ fn assoc_type_bindings_from_type_bound<'a>(
753 None => return SmallVec::<[GenericPredicate; 1]>::new(), 754 None => return SmallVec::<[GenericPredicate; 1]>::new(),
754 Some(t) => t, 755 Some(t) => t,
755 }; 756 };
756 let projection_ty = ProjectionTy { associated_ty, parameters: super_trait_ref.substs }; 757 let projection_ty = ProjectionTy {
758 associated_ty: to_assoc_type_id(associated_ty),
759 parameters: super_trait_ref.substs,
760 };
757 let mut preds = SmallVec::with_capacity( 761 let mut preds = SmallVec::with_capacity(
758 binding.type_ref.as_ref().map_or(0, |_| 1) + binding.bounds.len(), 762 binding.type_ref.as_ref().map_or(0, |_| 1) + binding.bounds.len(),
759 ); 763 );
diff --git a/crates/hir_ty/src/traits/chalk.rs b/crates/hir_ty/src/traits/chalk.rs
index 55181cc49..2d3cd6719 100644
--- a/crates/hir_ty/src/traits/chalk.rs
+++ b/crates/hir_ty/src/traits/chalk.rs
@@ -17,14 +17,15 @@ use super::ChalkContext;
17use crate::{ 17use crate::{
18 db::HirDatabase, 18 db::HirDatabase,
19 display::HirDisplay, 19 display::HirDisplay,
20 from_assoc_type_id,
20 method_resolution::{TyFingerprint, ALL_FLOAT_FPS, ALL_INT_FPS}, 21 method_resolution::{TyFingerprint, ALL_FLOAT_FPS, ALL_INT_FPS},
22 to_assoc_type_id,
21 utils::generics, 23 utils::generics,
22 BoundVar, CallableDefId, CallableSig, DebruijnIndex, GenericPredicate, ProjectionPredicate, 24 BoundVar, CallableDefId, CallableSig, DebruijnIndex, GenericPredicate, ProjectionPredicate,
23 ProjectionTy, Substs, TraitRef, Ty, TyKind, 25 ProjectionTy, Substs, TraitRef, Ty, TyKind,
24}; 26};
25use mapping::{ 27use mapping::{
26 convert_where_clauses, generic_predicate_to_inline_bound, make_binders, TypeAliasAsAssocType, 28 convert_where_clauses, generic_predicate_to_inline_bound, make_binders, TypeAliasAsValue,
27 TypeAliasAsValue,
28}; 29};
29 30
30pub use self::interner::Interner; 31pub use self::interner::Interner;
@@ -234,7 +235,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
234 ty: TyKind::BoundVar(BoundVar { debruijn: DebruijnIndex::ONE, index: 0 }) 235 ty: TyKind::BoundVar(BoundVar { debruijn: DebruijnIndex::ONE, index: 0 })
235 .intern(&Interner), 236 .intern(&Interner),
236 projection_ty: ProjectionTy { 237 projection_ty: ProjectionTy {
237 associated_ty: future_output, 238 associated_ty: to_assoc_type_id(future_output),
238 // Self type as the first parameter. 239 // Self type as the first parameter.
239 parameters: Substs::single( 240 parameters: Substs::single(
240 TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0)) 241 TyKind::BoundVar(BoundVar::new(DebruijnIndex::INNERMOST, 0))
@@ -383,7 +384,7 @@ pub(crate) fn associated_ty_data_query(
383 id: AssocTypeId, 384 id: AssocTypeId,
384) -> Arc<AssociatedTyDatum> { 385) -> Arc<AssociatedTyDatum> {
385 debug!("associated_ty_data {:?}", id); 386 debug!("associated_ty_data {:?}", id);
386 let type_alias: TypeAliasId = from_chalk::<TypeAliasAsAssocType, _>(db, id).0; 387 let type_alias: TypeAliasId = from_assoc_type_id(id);
387 let trait_ = match type_alias.lookup(db.upcast()).container { 388 let trait_ = match type_alias.lookup(db.upcast()).container {
388 AssocContainerId::TraitId(t) => t, 389 AssocContainerId::TraitId(t) => t,
389 _ => panic!("associated type not in trait"), 390 _ => panic!("associated type not in trait"),
@@ -438,10 +439,8 @@ pub(crate) fn trait_datum_query(
438 fundamental: false, 439 fundamental: false,
439 }; 440 };
440 let where_clauses = convert_where_clauses(db, trait_.into(), &bound_vars); 441 let where_clauses = convert_where_clauses(db, trait_.into(), &bound_vars);
441 let associated_ty_ids = trait_data 442 let associated_ty_ids =
442 .associated_types() 443 trait_data.associated_types().map(|type_alias| to_assoc_type_id(type_alias)).collect();
443 .map(|type_alias| TypeAliasAsAssocType(type_alias).to_chalk(db))
444 .collect();
445 let trait_datum_bound = rust_ir::TraitDatumBound { where_clauses }; 444 let trait_datum_bound = rust_ir::TraitDatumBound { where_clauses };
446 let well_known = 445 let well_known =
447 lang_attr(db.upcast(), trait_).and_then(|name| well_known_trait_from_lang_attr(&name)); 446 lang_attr(db.upcast(), trait_).and_then(|name| well_known_trait_from_lang_attr(&name));
@@ -623,7 +622,7 @@ fn type_alias_associated_ty_value(
623 let value_bound = rust_ir::AssociatedTyValueBound { ty: ty.value.to_chalk(db) }; 622 let value_bound = rust_ir::AssociatedTyValueBound { ty: ty.value.to_chalk(db) };
624 let value = rust_ir::AssociatedTyValue { 623 let value = rust_ir::AssociatedTyValue {
625 impl_id: impl_id.to_chalk(db), 624 impl_id: impl_id.to_chalk(db),
626 associated_ty_id: TypeAliasAsAssocType(assoc_ty).to_chalk(db), 625 associated_ty_id: to_assoc_type_id(assoc_ty),
627 value: make_binders(value_bound, ty.num_binders), 626 value: make_binders(value_bound, ty.num_binders),
628 }; 627 };
629 Arc::new(value) 628 Arc::new(value)
diff --git a/crates/hir_ty/src/traits/chalk/mapping.rs b/crates/hir_ty/src/traits/chalk/mapping.rs
index cf490f9c5..67ac95a0e 100644
--- a/crates/hir_ty/src/traits/chalk/mapping.rs
+++ b/crates/hir_ty/src/traits/chalk/mapping.rs
@@ -14,6 +14,7 @@ use hir_def::{AssocContainerId, GenericDefId, Lookup, TypeAliasId};
14 14
15use crate::{ 15use crate::{
16 db::HirDatabase, 16 db::HirDatabase,
17 from_assoc_type_id,
17 primitive::UintTy, 18 primitive::UintTy,
18 traits::{Canonical, Obligation}, 19 traits::{Canonical, Obligation},
19 AliasTy, CallableDefId, FnPointer, FnSig, GenericPredicate, InEnvironment, OpaqueTy, 20 AliasTy, CallableDefId, FnPointer, FnSig, GenericPredicate, InEnvironment, OpaqueTy,
@@ -38,9 +39,7 @@ impl ToChalk for Ty {
38 }) 39 })
39 .intern(&Interner) 40 .intern(&Interner)
40 } 41 }
41 TyKind::AssociatedType(type_alias, substs) => { 42 TyKind::AssociatedType(assoc_type_id, substs) => {
42 let assoc_type = TypeAliasAsAssocType(type_alias);
43 let assoc_type_id = assoc_type.to_chalk(db);
44 let substitution = substs.to_chalk(db); 43 let substitution = substs.to_chalk(db);
45 chalk_ir::TyKind::AssociatedType(assoc_type_id, substitution).intern(&Interner) 44 chalk_ir::TyKind::AssociatedType(assoc_type_id, substitution).intern(&Interner)
46 } 45 }
@@ -85,7 +84,7 @@ impl ToChalk for Ty {
85 chalk_ir::TyKind::Adt(adt_id, substitution).intern(&Interner) 84 chalk_ir::TyKind::Adt(adt_id, substitution).intern(&Interner)
86 } 85 }
87 TyKind::Alias(AliasTy::Projection(proj_ty)) => { 86 TyKind::Alias(AliasTy::Projection(proj_ty)) => {
88 let associated_ty_id = TypeAliasAsAssocType(proj_ty.associated_ty).to_chalk(db); 87 let associated_ty_id = proj_ty.associated_ty;
89 let substitution = proj_ty.parameters.to_chalk(db); 88 let substitution = proj_ty.parameters.to_chalk(db);
90 chalk_ir::AliasTy::Projection(chalk_ir::ProjectionTy { 89 chalk_ir::AliasTy::Projection(chalk_ir::ProjectionTy {
91 associated_ty_id, 90 associated_ty_id,
@@ -139,8 +138,7 @@ impl ToChalk for Ty {
139 TyKind::Placeholder(db.lookup_intern_type_param_id(interned_id)) 138 TyKind::Placeholder(db.lookup_intern_type_param_id(interned_id))
140 } 139 }
141 chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Projection(proj)) => { 140 chalk_ir::TyKind::Alias(chalk_ir::AliasTy::Projection(proj)) => {
142 let associated_ty = 141 let associated_ty = proj.associated_ty_id;
143 from_chalk::<TypeAliasAsAssocType, _>(db, proj.associated_ty_id).0;
144 let parameters = from_chalk(db, proj.substitution); 142 let parameters = from_chalk(db, proj.substitution);
145 TyKind::Alias(AliasTy::Projection(ProjectionTy { associated_ty, parameters })) 143 TyKind::Alias(AliasTy::Projection(ProjectionTy { associated_ty, parameters }))
146 } 144 }
@@ -180,10 +178,9 @@ impl ToChalk for Ty {
180 } 178 }
181 179
182 chalk_ir::TyKind::Adt(adt_id, subst) => TyKind::Adt(adt_id, from_chalk(db, subst)), 180 chalk_ir::TyKind::Adt(adt_id, subst) => TyKind::Adt(adt_id, from_chalk(db, subst)),
183 chalk_ir::TyKind::AssociatedType(type_id, subst) => TyKind::AssociatedType( 181 chalk_ir::TyKind::AssociatedType(type_id, subst) => {
184 from_chalk::<TypeAliasAsAssocType, _>(db, type_id).0, 182 TyKind::AssociatedType(type_id, from_chalk(db, subst))
185 from_chalk(db, subst), 183 }
186 ),
187 184
188 chalk_ir::TyKind::OpaqueType(opaque_type_id, subst) => { 185 chalk_ir::TyKind::OpaqueType(opaque_type_id, subst) => {
189 TyKind::OpaqueType(from_chalk(db, opaque_type_id), from_chalk(db, subst)) 186 TyKind::OpaqueType(from_chalk(db, opaque_type_id), from_chalk(db, subst))
@@ -332,20 +329,6 @@ impl ToChalk for CallableDefId {
332 } 329 }
333} 330}
334 331
335pub(crate) struct TypeAliasAsAssocType(pub(crate) TypeAliasId);
336
337impl ToChalk for TypeAliasAsAssocType {
338 type Chalk = AssocTypeId;
339
340 fn to_chalk(self, _db: &dyn HirDatabase) -> AssocTypeId {
341 chalk_ir::AssocTypeId(self.0.as_intern_id())
342 }
343
344 fn from_chalk(_db: &dyn HirDatabase, assoc_type_id: AssocTypeId) -> TypeAliasAsAssocType {
345 TypeAliasAsAssocType(InternKey::from_intern_id(assoc_type_id.0))
346 }
347}
348
349pub(crate) struct TypeAliasAsValue(pub(crate) TypeAliasId); 332pub(crate) struct TypeAliasAsValue(pub(crate) TypeAliasId);
350 333
351impl ToChalk for TypeAliasAsValue { 334impl ToChalk for TypeAliasAsValue {
@@ -427,7 +410,7 @@ impl ToChalk for ProjectionTy {
427 410
428 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::ProjectionTy<Interner> { 411 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::ProjectionTy<Interner> {
429 chalk_ir::ProjectionTy { 412 chalk_ir::ProjectionTy {
430 associated_ty_id: TypeAliasAsAssocType(self.associated_ty).to_chalk(db), 413 associated_ty_id: self.associated_ty,
431 substitution: self.parameters.to_chalk(db), 414 substitution: self.parameters.to_chalk(db),
432 } 415 }
433 } 416 }
@@ -437,11 +420,7 @@ impl ToChalk for ProjectionTy {
437 projection_ty: chalk_ir::ProjectionTy<Interner>, 420 projection_ty: chalk_ir::ProjectionTy<Interner>,
438 ) -> ProjectionTy { 421 ) -> ProjectionTy {
439 ProjectionTy { 422 ProjectionTy {
440 associated_ty: from_chalk::<TypeAliasAsAssocType, _>( 423 associated_ty: projection_ty.associated_ty_id,
441 db,
442 projection_ty.associated_ty_id,
443 )
444 .0,
445 parameters: from_chalk(db, projection_ty.substitution), 424 parameters: from_chalk(db, projection_ty.substitution),
446 } 425 }
447 } 426 }
@@ -595,7 +574,10 @@ pub(super) fn generic_predicate_to_inline_bound(
595 if &proj.projection_ty.parameters[0] != self_ty { 574 if &proj.projection_ty.parameters[0] != self_ty {
596 return None; 575 return None;
597 } 576 }
598 let trait_ = match proj.projection_ty.associated_ty.lookup(db.upcast()).container { 577 let trait_ = match from_assoc_type_id(proj.projection_ty.associated_ty)
578 .lookup(db.upcast())
579 .container
580 {
599 AssocContainerId::TraitId(t) => t, 581 AssocContainerId::TraitId(t) => t,
600 _ => panic!("associated type not in trait"), 582 _ => panic!("associated type not in trait"),
601 }; 583 };
@@ -606,8 +588,7 @@ pub(super) fn generic_predicate_to_inline_bound(
606 let alias_eq_bound = rust_ir::AliasEqBound { 588 let alias_eq_bound = rust_ir::AliasEqBound {
607 value: proj.ty.clone().to_chalk(db), 589 value: proj.ty.clone().to_chalk(db),
608 trait_bound: rust_ir::TraitBound { trait_id: trait_.to_chalk(db), args_no_self }, 590 trait_bound: rust_ir::TraitBound { trait_id: trait_.to_chalk(db), args_no_self },
609 associated_ty_id: TypeAliasAsAssocType(proj.projection_ty.associated_ty) 591 associated_ty_id: proj.projection_ty.associated_ty,
610 .to_chalk(db),
611 parameters: Vec::new(), // FIXME we don't support generic associated types yet 592 parameters: Vec::new(), // FIXME we don't support generic associated types yet
612 }; 593 };
613 Some(rust_ir::InlineBound::AliasEqBound(alias_eq_bound)) 594 Some(rust_ir::InlineBound::AliasEqBound(alias_eq_bound))
diff --git a/crates/hir_ty/src/traits/chalk/tls.rs b/crates/hir_ty/src/traits/chalk/tls.rs
index 75b16172e..8892a63a9 100644
--- a/crates/hir_ty/src/traits/chalk/tls.rs
+++ b/crates/hir_ty/src/traits/chalk/tls.rs
@@ -4,8 +4,8 @@ use std::fmt;
4use chalk_ir::{AliasTy, GenericArg, Goal, Goals, Lifetime, ProgramClauseImplication}; 4use chalk_ir::{AliasTy, GenericArg, Goal, Goals, Lifetime, ProgramClauseImplication};
5use itertools::Itertools; 5use itertools::Itertools;
6 6
7use super::{from_chalk, Interner, TypeAliasAsAssocType}; 7use super::{from_chalk, Interner};
8use crate::{db::HirDatabase, CallableDefId}; 8use crate::{db::HirDatabase, from_assoc_type_id, CallableDefId};
9use hir_def::{AdtId, AssocContainerId, Lookup, TypeAliasId}; 9use hir_def::{AdtId, AssocContainerId, Lookup, TypeAliasId};
10 10
11pub(crate) use unsafe_tls::{set_current_program, with_current_program}; 11pub(crate) use unsafe_tls::{set_current_program, with_current_program};
@@ -41,7 +41,7 @@ impl DebugContext<'_> {
41 id: super::AssocTypeId, 41 id: super::AssocTypeId,
42 fmt: &mut fmt::Formatter<'_>, 42 fmt: &mut fmt::Formatter<'_>,
43 ) -> Result<(), fmt::Error> { 43 ) -> Result<(), fmt::Error> {
44 let type_alias: TypeAliasId = from_chalk::<TypeAliasAsAssocType, _>(self.0, id).0; 44 let type_alias: TypeAliasId = from_assoc_type_id(id);
45 let type_alias_data = self.0.type_alias_data(type_alias); 45 let type_alias_data = self.0.type_alias_data(type_alias);
46 let trait_ = match type_alias.lookup(self.0.upcast()).container { 46 let trait_ = match type_alias.lookup(self.0.upcast()).container {
47 AssocContainerId::TraitId(t) => t, 47 AssocContainerId::TraitId(t) => t,
@@ -75,8 +75,7 @@ impl DebugContext<'_> {
75 projection_ty: &chalk_ir::ProjectionTy<Interner>, 75 projection_ty: &chalk_ir::ProjectionTy<Interner>,
76 fmt: &mut fmt::Formatter<'_>, 76 fmt: &mut fmt::Formatter<'_>,
77 ) -> Result<(), fmt::Error> { 77 ) -> Result<(), fmt::Error> {
78 let type_alias: TypeAliasId = 78 let type_alias = from_assoc_type_id(projection_ty.associated_ty_id);
79 from_chalk::<TypeAliasAsAssocType, _>(self.0, projection_ty.associated_ty_id).0;
80 let type_alias_data = self.0.type_alias_data(type_alias); 79 let type_alias_data = self.0.type_alias_data(type_alias);
81 let trait_ = match type_alias.lookup(self.0.upcast()).container { 80 let trait_ = match type_alias.lookup(self.0.upcast()).container {
82 AssocContainerId::TraitId(t) => t, 81 AssocContainerId::TraitId(t) => t,