diff options
-rw-r--r-- | crates/hir_ty/src/lib.rs | 29 | ||||
-rw-r--r-- | crates/hir_ty/src/types.rs | 15 |
2 files changed, 15 insertions, 29 deletions
diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs index 61f5adbc4..2c70c4277 100644 --- a/crates/hir_ty/src/lib.rs +++ b/crates/hir_ty/src/lib.rs | |||
@@ -99,15 +99,6 @@ where | |||
99 | Binders::empty(&Interner, value.shifted_in_from(DebruijnIndex::ONE)) | 99 | Binders::empty(&Interner, value.shifted_in_from(DebruijnIndex::ONE)) |
100 | } | 100 | } |
101 | 101 | ||
102 | impl<T: TypeWalk> Binders<T> { | ||
103 | /// Substitutes all variables. | ||
104 | pub fn substitute(self, interner: &Interner, subst: &Substitution) -> T { | ||
105 | let (value, binders) = self.into_value_and_skipped_binders(); | ||
106 | assert_eq!(subst.len(interner), binders.len(interner)); | ||
107 | value.subst_bound_vars(subst) | ||
108 | } | ||
109 | } | ||
110 | |||
111 | pub fn make_only_type_binders<T>(num_vars: usize, value: T) -> Binders<T> { | 102 | pub fn make_only_type_binders<T>(num_vars: usize, value: T) -> Binders<T> { |
112 | Binders::new( | 103 | Binders::new( |
113 | VariableKinds::from_iter( | 104 | VariableKinds::from_iter( |
@@ -120,31 +111,11 @@ pub fn make_only_type_binders<T>(num_vars: usize, value: T) -> Binders<T> { | |||
120 | } | 111 | } |
121 | 112 | ||
122 | impl TraitRef { | 113 | impl TraitRef { |
123 | pub fn self_type_parameter(&self, interner: &Interner) -> &Ty { | ||
124 | &self.substitution.at(interner, 0).assert_ty_ref(interner) | ||
125 | } | ||
126 | |||
127 | pub fn hir_trait_id(&self) -> TraitId { | 114 | pub fn hir_trait_id(&self) -> TraitId { |
128 | from_chalk_trait_id(self.trait_id) | 115 | from_chalk_trait_id(self.trait_id) |
129 | } | 116 | } |
130 | } | 117 | } |
131 | 118 | ||
132 | impl WhereClause { | ||
133 | pub fn is_implemented(&self) -> bool { | ||
134 | matches!(self, WhereClause::Implemented(_)) | ||
135 | } | ||
136 | |||
137 | pub fn trait_ref(&self, db: &dyn HirDatabase) -> Option<TraitRef> { | ||
138 | match self { | ||
139 | WhereClause::Implemented(tr) => Some(tr.clone()), | ||
140 | WhereClause::AliasEq(AliasEq { alias: AliasTy::Projection(proj), .. }) => { | ||
141 | Some(proj.trait_ref(db)) | ||
142 | } | ||
143 | WhereClause::AliasEq(_) => None, | ||
144 | } | ||
145 | } | ||
146 | } | ||
147 | |||
148 | impl<T> Canonical<T> { | 119 | impl<T> Canonical<T> { |
149 | pub fn new(value: T, kinds: impl IntoIterator<Item = TyVariableKind>) -> Self { | 120 | pub fn new(value: T, kinds: impl IntoIterator<Item = TyVariableKind>) -> Self { |
150 | let kinds = kinds.into_iter().map(|tk| { | 121 | let kinds = kinds.into_iter().map(|tk| { |
diff --git a/crates/hir_ty/src/types.rs b/crates/hir_ty/src/types.rs index 6dffda1ca..4a626d5e7 100644 --- a/crates/hir_ty/src/types.rs +++ b/crates/hir_ty/src/types.rs | |||
@@ -360,6 +360,15 @@ impl<T: Clone> Binders<&T> { | |||
360 | } | 360 | } |
361 | } | 361 | } |
362 | 362 | ||
363 | impl<T: TypeWalk> Binders<T> { | ||
364 | /// Substitutes all variables. | ||
365 | pub fn substitute(self, interner: &Interner, subst: &Substitution) -> T { | ||
366 | let (value, binders) = self.into_value_and_skipped_binders(); | ||
367 | assert_eq!(subst.len(interner), binders.len(interner)); | ||
368 | value.subst_bound_vars(subst) | ||
369 | } | ||
370 | } | ||
371 | |||
363 | impl<T: std::fmt::Debug> std::fmt::Debug for Binders<T> { | 372 | impl<T: std::fmt::Debug> std::fmt::Debug for Binders<T> { |
364 | fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { | 373 | fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { |
365 | let Binders { ref binders, ref value } = *self; | 374 | let Binders { ref binders, ref value } = *self; |
@@ -375,6 +384,12 @@ pub struct TraitRef { | |||
375 | pub substitution: Substitution, | 384 | pub substitution: Substitution, |
376 | } | 385 | } |
377 | 386 | ||
387 | impl TraitRef { | ||
388 | pub fn self_type_parameter(&self, interner: &Interner) -> &Ty { | ||
389 | &self.substitution.at(interner, 0).assert_ty_ref(interner) | ||
390 | } | ||
391 | } | ||
392 | |||
378 | /// Like `generics::WherePredicate`, but with resolved types: A condition on the | 393 | /// Like `generics::WherePredicate`, but with resolved types: A condition on the |
379 | /// parameters of a generic item. | 394 | /// parameters of a generic item. |
380 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 395 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |