aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorJosh Mcguigan <[email protected]>2020-03-01 14:25:38 +0000
committerJosh Mcguigan <[email protected]>2020-03-01 14:25:38 +0000
commitf353625705854877a8347c3a46f15e294a9338e4 (patch)
tree5a595ce0b149a0565ab562165dcd44a1642c0319 /crates
parent6db2da4993d3956fc7c8ebf152963a132611426a (diff)
match single prefix slice
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_hir_ty/src/infer/pat.rs16
-rw-r--r--crates/ra_hir_ty/src/tests/patterns.rs33
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;
12use test_utils::tested_by; 12use test_utils::tested_by;
13 13
14use super::{BindingMode, InferenceContext}; 14use super::{BindingMode, InferenceContext};
15use crate::{db::HirDatabase, utils::variant_data, Substs, Ty, TypeCtor}; 15use crate::{db::HirDatabase, utils::variant_data, Substs, Ty, TypeCtor, ApplicationTy};
16 16
17impl<'a, D: HirDatabase> InferenceContext<'a, D> { 17impl<'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, &parameters.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]
140fn infer_pattern_match_slice() {
141 assert_snapshot!(
142 infer(r#"
143fn 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]
140fn infer_adt_pattern() { 173fn infer_adt_pattern() {
141 assert_snapshot!( 174 assert_snapshot!(
142 infer(r#" 175 infer(r#"