Skip to content

Commit d0e282f

Browse files
committed
handle arbitrary length slices
1 parent f353625 commit d0e282f

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

crates/ra_hir_ty/src/infer/pat.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,12 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
188188
Pat::Slice { prefix, slice, suffix } => {
189189
if let Ty::Apply(ApplicationTy { ctor: TypeCtor::Slice, parameters }) = expected {
190190
match (prefix.as_slice(), slice, suffix.as_slice()) {
191-
([prefix_pat_id], None, []) => {
192-
let ty = self.infer_pat(*prefix_pat_id, &parameters.0[0], default_bm);
191+
(prefix_pat_ids, None, []) => {
192+
for pat_id in prefix_pat_ids {
193+
self.infer_pat(*pat_id, parameters.as_single(), default_bm);
194+
}
193195

194-
Ty::apply_one(TypeCtor::Slice, ty)
196+
Ty::apply_one(TypeCtor::Slice, parameters.as_single().clone())
195197
},
196198
_ => Ty::Unknown,
197199
}

crates/ra_hir_ty/src/tests/patterns.rs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,28 +143,43 @@ fn infer_pattern_match_slice() {
143143
fn test() {
144144
let slice: &[f64] = &[0.0];
145145
match slice {
146+
&[] => {},
146147
&[a] => {
147148
a;
149+
},
150+
&[b, c] => {
151+
b;
152+
c;
148153
}
149154
_ => {}
150155
}
151156
}
152157
"#),
153158
@r###"
154-
[11; 129) '{ ... } }': ()
159+
[11; 210) '{ ... } }': ()
155160
[21; 26) 'slice': &[f64]
156161
[37; 43) '&[0.0]': &[f64; _]
157162
[38; 43) '[0.0]': [f64; _]
158163
[39; 42) '0.0': f64
159-
[49; 127) 'match ... }': ()
164+
[49; 208) 'match ... }': ()
160165
[55; 60) 'slice': &[f64]
161-
[71; 75) '&[a]': &[f64]
162-
[72; 75) '[a]': [f64]
163-
[73; 74) 'a': f64
164-
[79; 105) '{ ... }': ()
165-
[93; 94) 'a': f64
166-
[114; 115) '_': &[f64]
167-
[119; 121) '{}': ()
166+
[71; 74) '&[]': &[f64]
167+
[72; 74) '[]': [f64]
168+
[78; 80) '{}': ()
169+
[90; 94) '&[a]': &[f64]
170+
[91; 94) '[a]': [f64]
171+
[92; 93) 'a': f64
172+
[98; 124) '{ ... }': ()
173+
[112; 113) 'a': f64
174+
[134; 141) '&[b, c]': &[f64]
175+
[135; 141) '[b, c]': [f64]
176+
[136; 137) 'b': f64
177+
[139; 140) 'c': f64
178+
[145; 186) '{ ... }': ()
179+
[159; 160) 'b': f64
180+
[174; 175) 'c': f64
181+
[195; 196) '_': &[f64]
182+
[200; 202) '{}': ()
168183
"###
169184
);
170185
}

0 commit comments

Comments
 (0)