aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/tests/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/tests/macros.rs')
-rw-r--r--crates/hir_ty/src/tests/macros.rs123
1 files changed, 121 insertions, 2 deletions
diff --git a/crates/hir_ty/src/tests/macros.rs b/crates/hir_ty/src/tests/macros.rs
index 7eda51866..3eb01dbd0 100644
--- a/crates/hir_ty/src/tests/macros.rs
+++ b/crates/hir_ty/src/tests/macros.rs
@@ -135,7 +135,88 @@ fn infer_path_qualified_macros_expanded() {
135} 135}
136 136
137#[test] 137#[test]
138fn expr_macro_expanded_in_various_places() { 138fn expr_macro_def_expanded_in_various_places() {
139 check_infer(
140 r#"
141 macro spam() {
142 1isize
143 }
144
145 fn spam() {
146 spam!();
147 (spam!());
148 spam!().spam(spam!());
149 for _ in spam!() {}
150 || spam!();
151 while spam!() {}
152 break spam!();
153 return spam!();
154 match spam!() {
155 _ if spam!() => spam!(),
156 }
157 spam!()(spam!());
158 Spam { spam: spam!() };
159 spam!()[spam!()];
160 await spam!();
161 spam!() as usize;
162 &spam!();
163 -spam!();
164 spam!()..spam!();
165 spam!() + spam!();
166 }
167 "#,
168 expect![[r#"
169 !0..6 '1isize': isize
170 !0..6 '1isize': isize
171 !0..6 '1isize': isize
172 !0..6 '1isize': isize
173 !0..6 '1isize': isize
174 !0..6 '1isize': isize
175 !0..6 '1isize': isize
176 !0..6 '1isize': isize
177 !0..6 '1isize': isize
178 !0..6 '1isize': isize
179 !0..6 '1isize': isize
180 !0..6 '1isize': isize
181 !0..6 '1isize': isize
182 !0..6 '1isize': isize
183 !0..6 '1isize': isize
184 !0..6 '1isize': isize
185 !0..6 '1isize': isize
186 !0..6 '1isize': isize
187 !0..6 '1isize': isize
188 !0..6 '1isize': isize
189 !0..6 '1isize': isize
190 !0..6 '1isize': isize
191 !0..6 '1isize': isize
192 !0..6 '1isize': isize
193 !0..6 '1isize': isize
194 39..442 '{ ...!(); }': ()
195 73..94 'spam!(...am!())': {unknown}
196 100..119 'for _ ...!() {}': ()
197 104..105 '_': {unknown}
198 117..119 '{}': ()
199 124..134 '|| spam!()': || -> isize
200 140..156 'while ...!() {}': ()
201 154..156 '{}': ()
202 161..174 'break spam!()': !
203 180..194 'return spam!()': !
204 200..254 'match ... }': isize
205 224..225 '_': isize
206 259..275 'spam!(...am!())': {unknown}
207 281..303 'Spam {...m!() }': {unknown}
208 309..325 'spam!(...am!()]': {unknown}
209 350..366 'spam!(... usize': usize
210 372..380 '&spam!()': &isize
211 386..394 '-spam!()': isize
212 400..416 'spam!(...pam!()': {unknown}
213 422..439 'spam!(...pam!()': isize
214 "#]],
215 );
216}
217
218#[test]
219fn expr_macro_rules_expanded_in_various_places() {
139 check_infer( 220 check_infer(
140 r#" 221 r#"
141 macro_rules! spam { 222 macro_rules! spam {
@@ -226,12 +307,49 @@ fn expr_macro_expanded_in_stmts() {
226 "#, 307 "#,
227 expect![[r#" 308 expect![[r#"
228 !0..8 'leta=();': () 309 !0..8 'leta=();': ()
310 !0..8 'leta=();': ()
311 !3..4 'a': ()
312 !5..7 '()': ()
229 57..84 '{ ...); } }': () 313 57..84 '{ ...); } }': ()
230 "#]], 314 "#]],
231 ); 315 );
232} 316}
233 317
234#[test] 318#[test]
319fn recurisve_macro_expanded_in_stmts() {
320 check_infer(
321 r#"
322 macro_rules! ng {
323 ([$($tts:tt)*]) => {
324 $($tts)*;
325 };
326 ([$($tts:tt)*] $head:tt $($rest:tt)*) => {
327 ng! {
328 [$($tts)* $head] $($rest)*
329 }
330 };
331 }
332 fn foo() {
333 ng!([] let a = 3);
334 let b = a;
335 }
336 "#,
337 expect![[r#"
338 !0..7 'leta=3;': {unknown}
339 !0..7 'leta=3;': {unknown}
340 !0..13 'ng!{[leta=3]}': {unknown}
341 !0..13 'ng!{[leta=]3}': {unknown}
342 !0..13 'ng!{[leta]=3}': {unknown}
343 !3..4 'a': i32
344 !5..6 '3': i32
345 196..237 '{ ...= a; }': ()
346 229..230 'b': i32
347 233..234 'a': i32
348 "#]],
349 );
350}
351
352#[test]
235fn recursive_inner_item_macro_rules() { 353fn recursive_inner_item_macro_rules() {
236 check_infer( 354 check_infer(
237 r#" 355 r#"
@@ -246,7 +364,8 @@ fn recursive_inner_item_macro_rules() {
246 "#, 364 "#,
247 expect![[r#" 365 expect![[r#"
248 !0..1 '1': i32 366 !0..1 '1': i32
249 !0..7 'mac!($)': {unknown} 367 !0..26 'macro_...>{1};}': {unknown}
368 !0..26 'macro_...>{1};}': {unknown}
250 107..143 '{ ...!(); }': () 369 107..143 '{ ...!(); }': ()
251 129..130 'a': i32 370 129..130 'a': i32
252 "#]], 371 "#]],