diff options
author | Florian Diebold <[email protected]> | 2019-08-23 16:19:37 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-09-03 13:00:35 +0100 |
commit | 741e350d4b7c3561f242207541ac9d7cab6ce45f (patch) | |
tree | 8ab45d1f2491395eba0e6f938eddc65f15d2667d /crates/ra_hir/src/ty/traits.rs | |
parent | 966ab9abd2253e68d2e410a58dc1328805ee7f61 (diff) |
Add support for associated type bindings (`where Trait<Type = X>`)
Diffstat (limited to 'crates/ra_hir/src/ty/traits.rs')
-rw-r--r-- | crates/ra_hir/src/ty/traits.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/crates/ra_hir/src/ty/traits.rs b/crates/ra_hir/src/ty/traits.rs index b634f0b79..25316bc02 100644 --- a/crates/ra_hir/src/ty/traits.rs +++ b/crates/ra_hir/src/ty/traits.rs | |||
@@ -124,6 +124,9 @@ impl Obligation { | |||
124 | pub fn from_predicate(predicate: GenericPredicate) -> Option<Obligation> { | 124 | pub fn from_predicate(predicate: GenericPredicate) -> Option<Obligation> { |
125 | match predicate { | 125 | match predicate { |
126 | GenericPredicate::Implemented(trait_ref) => Some(Obligation::Trait(trait_ref)), | 126 | GenericPredicate::Implemented(trait_ref) => Some(Obligation::Trait(trait_ref)), |
127 | GenericPredicate::Projection(projection_pred) => { | ||
128 | Some(Obligation::Projection(projection_pred)) | ||
129 | } | ||
127 | GenericPredicate::Error => None, | 130 | GenericPredicate::Error => None, |
128 | } | 131 | } |
129 | } | 132 | } |
@@ -135,6 +138,30 @@ pub struct ProjectionPredicate { | |||
135 | pub ty: Ty, | 138 | pub ty: Ty, |
136 | } | 139 | } |
137 | 140 | ||
141 | impl ProjectionPredicate { | ||
142 | pub fn subst(mut self, substs: &super::Substs) -> ProjectionPredicate { | ||
143 | self.walk_mut(&mut |ty| match ty { | ||
144 | Ty::Param { idx, .. } => { | ||
145 | if let Some(t) = substs.get(*idx as usize).cloned() { | ||
146 | *ty = t; | ||
147 | } | ||
148 | } | ||
149 | _ => {} | ||
150 | }); | ||
151 | self | ||
152 | } | ||
153 | |||
154 | pub fn walk(&self, f: &mut impl FnMut(&Ty)) { | ||
155 | self.projection_ty.walk(f); | ||
156 | self.ty.walk(f); | ||
157 | } | ||
158 | |||
159 | pub fn walk_mut(&mut self, f: &mut impl FnMut(&mut Ty)) { | ||
160 | self.projection_ty.walk_mut(f); | ||
161 | self.ty.walk_mut(f); | ||
162 | } | ||
163 | } | ||
164 | |||
138 | /// Solve a trait goal using Chalk. | 165 | /// Solve a trait goal using Chalk. |
139 | pub(crate) fn trait_solve_query( | 166 | pub(crate) fn trait_solve_query( |
140 | db: &impl HirDatabase, | 167 | db: &impl HirDatabase, |