diff options
Diffstat (limited to 'crates/hir_ty/src')
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 5 | ||||
-rw-r--r-- | crates/hir_ty/src/infer/pat.rs | 6 | ||||
-rw-r--r-- | crates/hir_ty/src/lib.rs | 28 | ||||
-rw-r--r-- | crates/hir_ty/src/walk.rs | 26 |
4 files changed, 24 insertions, 41 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 9ab0fa212..9841988c5 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -412,7 +412,10 @@ impl<'a> InferenceContext<'a> { | |||
412 | 412 | ||
413 | self.unify(&ty, &expected.ty); | 413 | self.unify(&ty, &expected.ty); |
414 | 414 | ||
415 | let substs = ty.substs().cloned().unwrap_or_else(|| Substitution::empty(&Interner)); | 415 | let substs = ty |
416 | .as_adt() | ||
417 | .map(|(_, s)| s.clone()) | ||
418 | .unwrap_or_else(|| Substitution::empty(&Interner)); | ||
416 | let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default(); | 419 | let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default(); |
417 | let variant_data = def_id.map(|it| it.variant_data(self.db.upcast())); | 420 | let variant_data = def_id.map(|it| it.variant_data(self.db.upcast())); |
418 | for field in fields.iter() { | 421 | for field in fields.iter() { |
diff --git a/crates/hir_ty/src/infer/pat.rs b/crates/hir_ty/src/infer/pat.rs index e4813c87c..f88d5c5d3 100644 --- a/crates/hir_ty/src/infer/pat.rs +++ b/crates/hir_ty/src/infer/pat.rs | |||
@@ -33,7 +33,8 @@ impl<'a> InferenceContext<'a> { | |||
33 | } | 33 | } |
34 | self.unify(&ty, expected); | 34 | self.unify(&ty, expected); |
35 | 35 | ||
36 | let substs = ty.substs().cloned().unwrap_or_else(|| Substitution::empty(&Interner)); | 36 | let substs = |
37 | ty.as_adt().map(|(_, s)| s.clone()).unwrap_or_else(|| Substitution::empty(&Interner)); | ||
37 | 38 | ||
38 | let field_tys = def.map(|it| self.db.field_types(it)).unwrap_or_default(); | 39 | let field_tys = def.map(|it| self.db.field_types(it)).unwrap_or_default(); |
39 | let (pre, post) = match ellipsis { | 40 | let (pre, post) = match ellipsis { |
@@ -74,7 +75,8 @@ impl<'a> InferenceContext<'a> { | |||
74 | 75 | ||
75 | self.unify(&ty, expected); | 76 | self.unify(&ty, expected); |
76 | 77 | ||
77 | let substs = ty.substs().cloned().unwrap_or_else(|| Substitution::empty(&Interner)); | 78 | let substs = |
79 | ty.as_adt().map(|(_, s)| s.clone()).unwrap_or_else(|| Substitution::empty(&Interner)); | ||
78 | 80 | ||
79 | let field_tys = def.map(|it| self.db.field_types(it)).unwrap_or_default(); | 81 | let field_tys = def.map(|it| self.db.field_types(it)).unwrap_or_default(); |
80 | for subpat in subpats { | 82 | for subpat in subpats { |
diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs index ae3987752..84645c435 100644 --- a/crates/hir_ty/src/lib.rs +++ b/crates/hir_ty/src/lib.rs | |||
@@ -198,34 +198,6 @@ impl Ty { | |||
198 | _ => false, | 198 | _ => false, |
199 | } | 199 | } |
200 | } | 200 | } |
201 | |||
202 | /// Returns the type parameters of this type if it has some (i.e. is an ADT | ||
203 | /// or function); so if `self` is `Option<u32>`, this returns the `u32`. | ||
204 | pub fn substs(&self) -> Option<&Substitution> { | ||
205 | match self.kind(&Interner) { | ||
206 | TyKind::Adt(_, substs) | ||
207 | | TyKind::FnDef(_, substs) | ||
208 | | TyKind::Tuple(_, substs) | ||
209 | | TyKind::OpaqueType(_, substs) | ||
210 | | TyKind::AssociatedType(_, substs) | ||
211 | | TyKind::Closure(.., substs) => Some(substs), | ||
212 | TyKind::Function(FnPointer { substitution: substs, .. }) => Some(&substs.0), | ||
213 | _ => None, | ||
214 | } | ||
215 | } | ||
216 | |||
217 | fn substs_mut(&mut self) -> Option<&mut Substitution> { | ||
218 | match self.interned_mut() { | ||
219 | TyKind::Adt(_, substs) | ||
220 | | TyKind::FnDef(_, substs) | ||
221 | | TyKind::Tuple(_, substs) | ||
222 | | TyKind::OpaqueType(_, substs) | ||
223 | | TyKind::AssociatedType(_, substs) | ||
224 | | TyKind::Closure(.., substs) => Some(substs), | ||
225 | TyKind::Function(FnPointer { substitution: substs, .. }) => Some(&mut substs.0), | ||
226 | _ => None, | ||
227 | } | ||
228 | } | ||
229 | } | 201 | } |
230 | 202 | ||
231 | #[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)] | 203 | #[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)] |
diff --git a/crates/hir_ty/src/walk.rs b/crates/hir_ty/src/walk.rs index 41ebf6137..91116dcda 100644 --- a/crates/hir_ty/src/walk.rs +++ b/crates/hir_ty/src/walk.rs | |||
@@ -162,13 +162,15 @@ impl TypeWalk for Ty { | |||
162 | TyKind::Function(fn_pointer) => { | 162 | TyKind::Function(fn_pointer) => { |
163 | fn_pointer.substitution.0.walk(f); | 163 | fn_pointer.substitution.0.walk(f); |
164 | } | 164 | } |
165 | _ => { | 165 | TyKind::Adt(_, substs) |
166 | if let Some(substs) = self.substs() { | 166 | | TyKind::FnDef(_, substs) |
167 | for t in substs.iter(&Interner) { | 167 | | TyKind::Tuple(_, substs) |
168 | t.walk(f); | 168 | | TyKind::OpaqueType(_, substs) |
169 | } | 169 | | TyKind::AssociatedType(_, substs) |
170 | } | 170 | | TyKind::Closure(.., substs) => { |
171 | substs.walk(f); | ||
171 | } | 172 | } |
173 | _ => {} | ||
172 | } | 174 | } |
173 | f(self); | 175 | f(self); |
174 | } | 176 | } |
@@ -199,11 +201,15 @@ impl TypeWalk for Ty { | |||
199 | TyKind::Function(fn_pointer) => { | 201 | TyKind::Function(fn_pointer) => { |
200 | fn_pointer.substitution.0.walk_mut_binders(f, binders.shifted_in()); | 202 | fn_pointer.substitution.0.walk_mut_binders(f, binders.shifted_in()); |
201 | } | 203 | } |
202 | _ => { | 204 | TyKind::Adt(_, substs) |
203 | if let Some(substs) = self.substs_mut() { | 205 | | TyKind::FnDef(_, substs) |
204 | substs.walk_mut_binders(f, binders); | 206 | | TyKind::Tuple(_, substs) |
205 | } | 207 | | TyKind::OpaqueType(_, substs) |
208 | | TyKind::AssociatedType(_, substs) | ||
209 | | TyKind::Closure(.., substs) => { | ||
210 | substs.walk_mut_binders(f, binders); | ||
206 | } | 211 | } |
212 | _ => {} | ||
207 | } | 213 | } |
208 | f(self, binders); | 214 | f(self, binders); |
209 | } | 215 | } |