diff options
Diffstat (limited to 'crates/ra_hir_ty/src/tests/patterns.rs')
-rw-r--r-- | crates/ra_hir_ty/src/tests/patterns.rs | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/crates/ra_hir_ty/src/tests/patterns.rs b/crates/ra_hir_ty/src/tests/patterns.rs new file mode 100644 index 000000000..cb3890b42 --- /dev/null +++ b/crates/ra_hir_ty/src/tests/patterns.rs | |||
@@ -0,0 +1,238 @@ | |||
1 | use super::infer; | ||
2 | use insta::assert_snapshot; | ||
3 | use test_utils::covers; | ||
4 | |||
5 | #[test] | ||
6 | fn infer_pattern() { | ||
7 | assert_snapshot!( | ||
8 | infer(r#" | ||
9 | fn test(x: &i32) { | ||
10 | let y = x; | ||
11 | let &z = x; | ||
12 | let a = z; | ||
13 | let (c, d) = (1, "hello"); | ||
14 | |||
15 | for (e, f) in some_iter { | ||
16 | let g = e; | ||
17 | } | ||
18 | |||
19 | if let [val] = opt { | ||
20 | let h = val; | ||
21 | } | ||
22 | |||
23 | let lambda = |a: u64, b, c: i32| { a + b; c }; | ||
24 | |||
25 | let ref ref_to_x = x; | ||
26 | let mut mut_x = x; | ||
27 | let ref mut mut_ref_to_x = x; | ||
28 | let k = mut_ref_to_x; | ||
29 | } | ||
30 | "#), | ||
31 | @r###" | ||
32 | [9; 10) 'x': &i32 | ||
33 | [18; 369) '{ ...o_x; }': () | ||
34 | [28; 29) 'y': &i32 | ||
35 | [32; 33) 'x': &i32 | ||
36 | [43; 45) '&z': &i32 | ||
37 | [44; 45) 'z': i32 | ||
38 | [48; 49) 'x': &i32 | ||
39 | [59; 60) 'a': i32 | ||
40 | [63; 64) 'z': i32 | ||
41 | [74; 80) '(c, d)': (i32, &str) | ||
42 | [75; 76) 'c': i32 | ||
43 | [78; 79) 'd': &str | ||
44 | [83; 95) '(1, "hello")': (i32, &str) | ||
45 | [84; 85) '1': i32 | ||
46 | [87; 94) '"hello"': &str | ||
47 | [102; 152) 'for (e... }': () | ||
48 | [106; 112) '(e, f)': ({unknown}, {unknown}) | ||
49 | [107; 108) 'e': {unknown} | ||
50 | [110; 111) 'f': {unknown} | ||
51 | [116; 125) 'some_iter': {unknown} | ||
52 | [126; 152) '{ ... }': () | ||
53 | [140; 141) 'g': {unknown} | ||
54 | [144; 145) 'e': {unknown} | ||
55 | [158; 205) 'if let... }': () | ||
56 | [165; 170) '[val]': {unknown} | ||
57 | [173; 176) 'opt': {unknown} | ||
58 | [177; 205) '{ ... }': () | ||
59 | [191; 192) 'h': {unknown} | ||
60 | [195; 198) 'val': {unknown} | ||
61 | [215; 221) 'lambda': |u64, u64, i32| -> i32 | ||
62 | [224; 256) '|a: u6...b; c }': |u64, u64, i32| -> i32 | ||
63 | [225; 226) 'a': u64 | ||
64 | [233; 234) 'b': u64 | ||
65 | [236; 237) 'c': i32 | ||
66 | [244; 256) '{ a + b; c }': i32 | ||
67 | [246; 247) 'a': u64 | ||
68 | [246; 251) 'a + b': u64 | ||
69 | [250; 251) 'b': u64 | ||
70 | [253; 254) 'c': i32 | ||
71 | [267; 279) 'ref ref_to_x': &&i32 | ||
72 | [282; 283) 'x': &i32 | ||
73 | [293; 302) 'mut mut_x': &i32 | ||
74 | [305; 306) 'x': &i32 | ||
75 | [316; 336) 'ref mu...f_to_x': &mut &i32 | ||
76 | [339; 340) 'x': &i32 | ||
77 | [350; 351) 'k': &mut &i32 | ||
78 | [354; 366) 'mut_ref_to_x': &mut &i32 | ||
79 | "### | ||
80 | ); | ||
81 | } | ||
82 | |||
83 | #[test] | ||
84 | fn infer_pattern_match_ergonomics() { | ||
85 | assert_snapshot!( | ||
86 | infer(r#" | ||
87 | struct A<T>(T); | ||
88 | |||
89 | fn test() { | ||
90 | let A(n) = &A(1); | ||
91 | let A(n) = &mut A(1); | ||
92 | } | ||
93 | "#), | ||
94 | @r###" | ||
95 | [28; 79) '{ ...(1); }': () | ||
96 | [38; 42) 'A(n)': A<i32> | ||
97 | [40; 41) 'n': &i32 | ||
98 | [45; 50) '&A(1)': &A<i32> | ||
99 | [46; 47) 'A': A<i32>(T) -> A<T> | ||
100 | [46; 50) 'A(1)': A<i32> | ||
101 | [48; 49) '1': i32 | ||
102 | [60; 64) 'A(n)': A<i32> | ||
103 | [62; 63) 'n': &mut i32 | ||
104 | [67; 76) '&mut A(1)': &mut A<i32> | ||
105 | [72; 73) 'A': A<i32>(T) -> A<T> | ||
106 | [72; 76) 'A(1)': A<i32> | ||
107 | [74; 75) '1': i32 | ||
108 | "### | ||
109 | ); | ||
110 | } | ||
111 | |||
112 | #[test] | ||
113 | fn infer_pattern_match_ergonomics_ref() { | ||
114 | covers!(match_ergonomics_ref); | ||
115 | assert_snapshot!( | ||
116 | infer(r#" | ||
117 | fn test() { | ||
118 | let v = &(1, &2); | ||
119 | let (_, &w) = v; | ||
120 | } | ||
121 | "#), | ||
122 | @r###" | ||
123 | [11; 57) '{ ...= v; }': () | ||
124 | [21; 22) 'v': &(i32, &i32) | ||
125 | [25; 33) '&(1, &2)': &(i32, &i32) | ||
126 | [26; 33) '(1, &2)': (i32, &i32) | ||
127 | [27; 28) '1': i32 | ||
128 | [30; 32) '&2': &i32 | ||
129 | [31; 32) '2': i32 | ||
130 | [43; 50) '(_, &w)': (i32, &i32) | ||
131 | [44; 45) '_': i32 | ||
132 | [47; 49) '&w': &i32 | ||
133 | [48; 49) 'w': i32 | ||
134 | [53; 54) 'v': &(i32, &i32) | ||
135 | "### | ||
136 | ); | ||
137 | } | ||
138 | |||
139 | #[test] | ||
140 | fn infer_adt_pattern() { | ||
141 | assert_snapshot!( | ||
142 | infer(r#" | ||
143 | enum E { | ||
144 | A { x: usize }, | ||
145 | B | ||
146 | } | ||
147 | |||
148 | struct S(u32, E); | ||
149 | |||
150 | fn test() { | ||
151 | let e = E::A { x: 3 }; | ||
152 | |||
153 | let S(y, z) = foo; | ||
154 | let E::A { x: new_var } = e; | ||
155 | |||
156 | match e { | ||
157 | E::A { x } => x, | ||
158 | E::B if foo => 1, | ||
159 | E::B => 10, | ||
160 | }; | ||
161 | |||
162 | let ref d @ E::A { .. } = e; | ||
163 | d; | ||
164 | } | ||
165 | "#), | ||
166 | @r###" | ||
167 | [68; 289) '{ ... d; }': () | ||
168 | [78; 79) 'e': E | ||
169 | [82; 95) 'E::A { x: 3 }': E | ||
170 | [92; 93) '3': usize | ||
171 | [106; 113) 'S(y, z)': S | ||
172 | [108; 109) 'y': u32 | ||
173 | [111; 112) 'z': E | ||
174 | [116; 119) 'foo': S | ||
175 | [129; 148) 'E::A {..._var }': E | ||
176 | [139; 146) 'new_var': usize | ||
177 | [151; 152) 'e': E | ||
178 | [159; 245) 'match ... }': usize | ||
179 | [165; 166) 'e': E | ||
180 | [177; 187) 'E::A { x }': E | ||
181 | [184; 185) 'x': usize | ||
182 | [191; 192) 'x': usize | ||
183 | [202; 206) 'E::B': E | ||
184 | [210; 213) 'foo': bool | ||
185 | [217; 218) '1': usize | ||
186 | [228; 232) 'E::B': E | ||
187 | [236; 238) '10': usize | ||
188 | [256; 275) 'ref d ...{ .. }': &E | ||
189 | [264; 275) 'E::A { .. }': E | ||
190 | [278; 279) 'e': E | ||
191 | [285; 286) 'd': &E | ||
192 | "### | ||
193 | ); | ||
194 | } | ||
195 | |||
196 | #[test] | ||
197 | fn infer_generics_in_patterns() { | ||
198 | assert_snapshot!( | ||
199 | infer(r#" | ||
200 | struct A<T> { | ||
201 | x: T, | ||
202 | } | ||
203 | |||
204 | enum Option<T> { | ||
205 | Some(T), | ||
206 | None, | ||
207 | } | ||
208 | |||
209 | fn test(a1: A<u32>, o: Option<u64>) { | ||
210 | let A { x: x2 } = a1; | ||
211 | let A::<i64> { x: x3 } = A { x: 1 }; | ||
212 | match o { | ||
213 | Option::Some(t) => t, | ||
214 | _ => 1, | ||
215 | }; | ||
216 | } | ||
217 | "#), | ||
218 | @r###" | ||
219 | [79; 81) 'a1': A<u32> | ||
220 | [91; 92) 'o': Option<u64> | ||
221 | [107; 244) '{ ... }; }': () | ||
222 | [117; 128) 'A { x: x2 }': A<u32> | ||
223 | [124; 126) 'x2': u32 | ||
224 | [131; 133) 'a1': A<u32> | ||
225 | [143; 161) 'A::<i6...: x3 }': A<i64> | ||
226 | [157; 159) 'x3': i64 | ||
227 | [164; 174) 'A { x: 1 }': A<i64> | ||
228 | [171; 172) '1': i64 | ||
229 | [180; 241) 'match ... }': u64 | ||
230 | [186; 187) 'o': Option<u64> | ||
231 | [198; 213) 'Option::Some(t)': Option<u64> | ||
232 | [211; 212) 't': u64 | ||
233 | [217; 218) 't': u64 | ||
234 | [228; 229) '_': Option<u64> | ||
235 | [233; 234) '1': u64 | ||
236 | "### | ||
237 | ); | ||
238 | } | ||