|
1 | 1 | //! Type inference for patterns.
|
2 | 2 |
|
3 |
| -use std::iter::repeat; |
| 3 | +use std::iter::repeat_with; |
4 | 4 |
|
5 | 5 | use chalk_ir::Mutability;
|
6 | 6 | use hir_def::{
|
@@ -140,15 +140,28 @@ impl<'a> InferenceContext<'a> {
|
140 | 140 | }
|
141 | 141 | None => ((&args[..], &[][..]), 0),
|
142 | 142 | };
|
143 |
| - let err_ty = self.err_ty(); |
144 |
| - let mut expectations_iter = |
145 |
| - expectations.iter().map(|a| a.assert_ty_ref(Interner)).chain(repeat(&err_ty)); |
146 |
| - let mut infer_pat = |(&pat, ty)| self.infer_pat(pat, ty, default_bm); |
| 143 | + let mut expectations_iter = expectations |
| 144 | + .iter() |
| 145 | + .cloned() |
| 146 | + .map(|a| a.assert_ty_ref(Interner).clone()) |
| 147 | + .chain(repeat_with(|| self.table.new_type_var())); |
147 | 148 |
|
148 | 149 | let mut inner_tys = Vec::with_capacity(n_uncovered_patterns + args.len());
|
149 |
| - inner_tys.extend(pre.iter().zip(expectations_iter.by_ref()).map(&mut infer_pat)); |
150 |
| - inner_tys.extend(expectations_iter.by_ref().take(n_uncovered_patterns).cloned()); |
151 |
| - inner_tys.extend(post.iter().zip(expectations_iter).map(infer_pat)); |
| 150 | + |
| 151 | + inner_tys |
| 152 | + .extend(expectations_iter.by_ref().take(n_uncovered_patterns + args.len())); |
| 153 | + |
| 154 | + // Process pre |
| 155 | + for (ty, pat) in inner_tys.iter_mut().zip(pre) { |
| 156 | + *ty = self.infer_pat(*pat, ty, default_bm); |
| 157 | + } |
| 158 | + |
| 159 | + // Process post |
| 160 | + for (ty, pat) in |
| 161 | + inner_tys.iter_mut().skip(pre.len() + n_uncovered_patterns).zip(post) |
| 162 | + { |
| 163 | + *ty = self.infer_pat(*pat, ty, default_bm); |
| 164 | + } |
152 | 165 |
|
153 | 166 | TyKind::Tuple(inner_tys.len(), Substitution::from_iter(Interner, inner_tys))
|
154 | 167 | .intern(Interner)
|
|
0 commit comments