From d0e282f6b1a8c698212f7f76de2ff122e36e17a2 Mon Sep 17 00:00:00 2001 From: Josh Mcguigan Date: Sun, 1 Mar 2020 07:08:05 -0800 Subject: handle arbitrary length slices --- crates/ra_hir_ty/src/infer/pat.rs | 8 +++++--- crates/ra_hir_ty/src/tests/patterns.rs | 33 ++++++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/crates/ra_hir_ty/src/infer/pat.rs b/crates/ra_hir_ty/src/infer/pat.rs index b991720ff..3fe1a4abb 100644 --- a/crates/ra_hir_ty/src/infer/pat.rs +++ b/crates/ra_hir_ty/src/infer/pat.rs @@ -188,10 +188,12 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { Pat::Slice { prefix, slice, suffix } => { if let Ty::Apply(ApplicationTy { ctor: TypeCtor::Slice, parameters }) = expected { match (prefix.as_slice(), slice, suffix.as_slice()) { - ([prefix_pat_id], None, []) => { - let ty = self.infer_pat(*prefix_pat_id, ¶meters.0[0], default_bm); + (prefix_pat_ids, None, []) => { + for pat_id in prefix_pat_ids { + self.infer_pat(*pat_id, parameters.as_single(), default_bm); + } - Ty::apply_one(TypeCtor::Slice, ty) + Ty::apply_one(TypeCtor::Slice, parameters.as_single().clone()) }, _ => Ty::Unknown, } diff --git a/crates/ra_hir_ty/src/tests/patterns.rs b/crates/ra_hir_ty/src/tests/patterns.rs index fdc9dd180..6a9413521 100644 --- a/crates/ra_hir_ty/src/tests/patterns.rs +++ b/crates/ra_hir_ty/src/tests/patterns.rs @@ -143,28 +143,43 @@ fn infer_pattern_match_slice() { fn test() { let slice: &[f64] = &[0.0]; match slice { + &[] => {}, &[a] => { a; + }, + &[b, c] => { + b; + c; } _ => {} } } "#), @r###" - [11; 129) '{ ... } }': () + [11; 210) '{ ... } }': () [21; 26) 'slice': &[f64] [37; 43) '&[0.0]': &[f64; _] [38; 43) '[0.0]': [f64; _] [39; 42) '0.0': f64 - [49; 127) 'match ... }': () + [49; 208) 'match ... }': () [55; 60) 'slice': &[f64] - [71; 75) '&[a]': &[f64] - [72; 75) '[a]': [f64] - [73; 74) 'a': f64 - [79; 105) '{ ... }': () - [93; 94) 'a': f64 - [114; 115) '_': &[f64] - [119; 121) '{}': () + [71; 74) '&[]': &[f64] + [72; 74) '[]': [f64] + [78; 80) '{}': () + [90; 94) '&[a]': &[f64] + [91; 94) '[a]': [f64] + [92; 93) 'a': f64 + [98; 124) '{ ... }': () + [112; 113) 'a': f64 + [134; 141) '&[b, c]': &[f64] + [135; 141) '[b, c]': [f64] + [136; 137) 'b': f64 + [139; 140) 'c': f64 + [145; 186) '{ ... }': () + [159; 160) 'b': f64 + [174; 175) 'c': f64 + [195; 196) '_': &[f64] + [200; 202) '{}': () "### ); } -- cgit v1.2.3