diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir_ty/src/infer/pat.rs | 16 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests/patterns.rs | 33 |
2 files changed, 48 insertions, 1 deletions
diff --git a/crates/ra_hir_ty/src/infer/pat.rs b/crates/ra_hir_ty/src/infer/pat.rs index bf8ea192b..b991720ff 100644 --- a/crates/ra_hir_ty/src/infer/pat.rs +++ b/crates/ra_hir_ty/src/infer/pat.rs | |||
@@ -12,7 +12,7 @@ use hir_expand::name::Name; | |||
12 | use test_utils::tested_by; | 12 | use test_utils::tested_by; |
13 | 13 | ||
14 | use super::{BindingMode, InferenceContext}; | 14 | use super::{BindingMode, InferenceContext}; |
15 | use crate::{db::HirDatabase, utils::variant_data, Substs, Ty, TypeCtor}; | 15 | use crate::{db::HirDatabase, utils::variant_data, Substs, Ty, TypeCtor, ApplicationTy}; |
16 | 16 | ||
17 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { | 17 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { |
18 | fn infer_tuple_struct_pat( | 18 | fn infer_tuple_struct_pat( |
@@ -185,6 +185,20 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
185 | self.write_pat_ty(pat, bound_ty); | 185 | self.write_pat_ty(pat, bound_ty); |
186 | return inner_ty; | 186 | return inner_ty; |
187 | } | 187 | } |
188 | Pat::Slice { prefix, slice, suffix } => { | ||
189 | if let Ty::Apply(ApplicationTy { ctor: TypeCtor::Slice, parameters }) = expected { | ||
190 | match (prefix.as_slice(), slice, suffix.as_slice()) { | ||
191 | ([prefix_pat_id], None, []) => { | ||
192 | let ty = self.infer_pat(*prefix_pat_id, ¶meters.0[0], default_bm); | ||
193 | |||
194 | Ty::apply_one(TypeCtor::Slice, ty) | ||
195 | }, | ||
196 | _ => Ty::Unknown, | ||
197 | } | ||
198 | } else { | ||
199 | Ty::Unknown | ||
200 | } | ||
201 | } | ||
188 | _ => Ty::Unknown, | 202 | _ => Ty::Unknown, |
189 | }; | 203 | }; |
190 | // use a new type variable if we got Ty::Unknown here | 204 | // use a new type variable if we got Ty::Unknown here |
diff --git a/crates/ra_hir_ty/src/tests/patterns.rs b/crates/ra_hir_ty/src/tests/patterns.rs index 81d00c2af..fdc9dd180 100644 --- a/crates/ra_hir_ty/src/tests/patterns.rs +++ b/crates/ra_hir_ty/src/tests/patterns.rs | |||
@@ -137,6 +137,39 @@ fn test() { | |||
137 | } | 137 | } |
138 | 138 | ||
139 | #[test] | 139 | #[test] |
140 | fn infer_pattern_match_slice() { | ||
141 | assert_snapshot!( | ||
142 | infer(r#" | ||
143 | fn test() { | ||
144 | let slice: &[f64] = &[0.0]; | ||
145 | match slice { | ||
146 | &[a] => { | ||
147 | a; | ||
148 | } | ||
149 | _ => {} | ||
150 | } | ||
151 | } | ||
152 | "#), | ||
153 | @r###" | ||
154 | [11; 129) '{ ... } }': () | ||
155 | [21; 26) 'slice': &[f64] | ||
156 | [37; 43) '&[0.0]': &[f64; _] | ||
157 | [38; 43) '[0.0]': [f64; _] | ||
158 | [39; 42) '0.0': f64 | ||
159 | [49; 127) 'match ... }': () | ||
160 | [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) '{}': () | ||
168 | "### | ||
169 | ); | ||
170 | } | ||
171 | |||
172 | #[test] | ||
140 | fn infer_adt_pattern() { | 173 | fn infer_adt_pattern() { |
141 | assert_snapshot!( | 174 | assert_snapshot!( |
142 | infer(r#" | 175 | infer(r#" |