diff options
Diffstat (limited to 'crates/hir_ty/src/lib.rs')
-rw-r--r-- | crates/hir_ty/src/lib.rs | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs index 61b5cf269..86973c7ed 100644 --- a/crates/hir_ty/src/lib.rs +++ b/crates/hir_ty/src/lib.rs | |||
@@ -66,6 +66,8 @@ pub type ClosureId = chalk_ir::ClosureId<Interner>; | |||
66 | pub type OpaqueTyId = chalk_ir::OpaqueTyId<Interner>; | 66 | pub type OpaqueTyId = chalk_ir::OpaqueTyId<Interner>; |
67 | pub type PlaceholderIndex = chalk_ir::PlaceholderIndex; | 67 | pub type PlaceholderIndex = chalk_ir::PlaceholderIndex; |
68 | 68 | ||
69 | pub type VariableKind = chalk_ir::VariableKind<Interner>; | ||
70 | pub type VariableKinds = chalk_ir::VariableKinds<Interner>; | ||
69 | pub type CanonicalVarKinds = chalk_ir::CanonicalVarKinds<Interner>; | 71 | pub type CanonicalVarKinds = chalk_ir::CanonicalVarKinds<Interner>; |
70 | 72 | ||
71 | pub type ChalkTraitId = chalk_ir::TraitId<Interner>; | 73 | pub type ChalkTraitId = chalk_ir::TraitId<Interner>; |
@@ -126,22 +128,26 @@ impl<T> Binders<T> { | |||
126 | } | 128 | } |
127 | } | 129 | } |
128 | 130 | ||
129 | impl<T: Clone> Binders<&T> { | ||
130 | pub fn cloned(&self) -> Binders<T> { | ||
131 | let (value, binders) = self.into_value_and_skipped_binders(); | ||
132 | Binders::new(binders, value.clone()) | ||
133 | } | ||
134 | } | ||
135 | |||
136 | impl<T: TypeWalk> Binders<T> { | 131 | impl<T: TypeWalk> Binders<T> { |
137 | /// Substitutes all variables. | 132 | /// Substitutes all variables. |
138 | pub fn subst(self, subst: &Substitution) -> T { | 133 | pub fn subst(self, subst: &Substitution) -> T { |
139 | let (value, binders) = self.into_value_and_skipped_binders(); | 134 | let (value, binders) = self.into_value_and_skipped_binders(); |
140 | assert_eq!(subst.len(&Interner), binders); | 135 | assert_eq!(subst.len(&Interner), binders.len(&Interner)); |
141 | value.subst_bound_vars(subst) | 136 | value.subst_bound_vars(subst) |
142 | } | 137 | } |
143 | } | 138 | } |
144 | 139 | ||
140 | pub fn make_only_type_binders<T>(num_vars: usize, value: T) -> Binders<T> { | ||
141 | Binders::new( | ||
142 | VariableKinds::from_iter( | ||
143 | &Interner, | ||
144 | std::iter::repeat(chalk_ir::VariableKind::Ty(chalk_ir::TyVariableKind::General)) | ||
145 | .take(num_vars), | ||
146 | ), | ||
147 | value, | ||
148 | ) | ||
149 | } | ||
150 | |||
145 | impl TraitRef { | 151 | impl TraitRef { |
146 | pub fn self_type_parameter(&self, interner: &Interner) -> &Ty { | 152 | pub fn self_type_parameter(&self, interner: &Interner) -> &Ty { |
147 | &self.substitution.at(interner, 0).assert_ty_ref(interner) | 153 | &self.substitution.at(interner, 0).assert_ty_ref(interner) |
@@ -407,8 +413,8 @@ impl Ty { | |||
407 | // This is only used by type walking. | 413 | // This is only used by type walking. |
408 | // Parameters will be walked outside, and projection predicate is not used. | 414 | // Parameters will be walked outside, and projection predicate is not used. |
409 | // So just provide the Future trait. | 415 | // So just provide the Future trait. |
410 | let impl_bound = Binders::new( | 416 | let impl_bound = Binders::empty( |
411 | 0, | 417 | &Interner, |
412 | WhereClause::Implemented(TraitRef { | 418 | WhereClause::Implemented(TraitRef { |
413 | trait_id: to_chalk_trait_id(future_trait), | 419 | trait_id: to_chalk_trait_id(future_trait), |
414 | substitution: Substitution::empty(&Interner), | 420 | substitution: Substitution::empty(&Interner), |