@@ -2,7 +2,8 @@ use stdx::format_to;
2
2
use syntax:: {
3
3
ast:: { self , AstNode } ,
4
4
SyntaxKind :: {
5
- BLOCK_EXPR , BREAK_EXPR , CLOSURE_EXPR , COMMENT , LOOP_EXPR , MATCH_ARM , PATH_EXPR , RETURN_EXPR ,
5
+ BLOCK_EXPR , BREAK_EXPR , CLOSURE_EXPR , COMMENT , LOOP_EXPR , MATCH_ARM , MATCH_GUARD ,
6
+ PATH_EXPR , RETURN_EXPR ,
6
7
} ,
7
8
SyntaxNode ,
8
9
} ;
@@ -147,9 +148,18 @@ impl Anchor {
147
148
}
148
149
149
150
if let Some ( parent) = node. parent ( ) {
150
- if parent. kind ( ) == MATCH_ARM || parent. kind ( ) == CLOSURE_EXPR {
151
+ if parent. kind ( ) == CLOSURE_EXPR {
152
+ cov_mark:: hit!( test_extract_var_in_closure_no_block) ;
151
153
return Some ( Anchor :: WrapInBlock ( node) ) ;
152
154
}
155
+ if parent. kind ( ) == MATCH_ARM {
156
+ if node. kind ( ) == MATCH_GUARD {
157
+ cov_mark:: hit!( test_extract_var_in_match_guard) ;
158
+ } else {
159
+ cov_mark:: hit!( test_extract_var_in_match_arm_no_block) ;
160
+ return Some ( Anchor :: WrapInBlock ( node) ) ;
161
+ }
162
+ }
153
163
}
154
164
155
165
if let Some ( stmt) = ast:: Stmt :: cast ( node. clone ( ) ) {
@@ -280,34 +290,35 @@ fn foo() {
280
290
281
291
#[ test]
282
292
fn test_extract_var_in_match_arm_no_block ( ) {
293
+ cov_mark:: check!( test_extract_var_in_match_arm_no_block) ;
283
294
check_assist (
284
295
extract_variable,
285
- "
296
+ r# "
286
297
fn main() {
287
298
let x = true;
288
299
let tuple = match x {
289
300
true => ($02 + 2$0, true)
290
301
_ => (0, false)
291
302
};
292
303
}
293
- " ,
294
- "
304
+ "# ,
305
+ r# "
295
306
fn main() {
296
307
let x = true;
297
308
let tuple = match x {
298
309
true => { let $0var_name = 2 + 2; (var_name, true) }
299
310
_ => (0, false)
300
311
};
301
312
}
302
- " ,
313
+ "# ,
303
314
) ;
304
315
}
305
316
306
317
#[ test]
307
318
fn test_extract_var_in_match_arm_with_block ( ) {
308
319
check_assist (
309
320
extract_variable,
310
- "
321
+ r# "
311
322
fn main() {
312
323
let x = true;
313
324
let tuple = match x {
@@ -318,8 +329,8 @@ fn main() {
318
329
_ => (0, false)
319
330
};
320
331
}
321
- " ,
322
- "
332
+ "# ,
333
+ r# "
323
334
fn main() {
324
335
let x = true;
325
336
let tuple = match x {
@@ -331,41 +342,67 @@ fn main() {
331
342
_ => (0, false)
332
343
};
333
344
}
334
- " ,
345
+ "# ,
346
+ ) ;
347
+ }
348
+
349
+ #[ test]
350
+ fn test_extract_var_in_match_guard ( ) {
351
+ cov_mark:: check!( test_extract_var_in_match_guard) ;
352
+ check_assist (
353
+ extract_variable,
354
+ r#"
355
+ fn main() {
356
+ match () {
357
+ () if $010 > 0$0 => 1
358
+ _ => 2
359
+ };
360
+ }
361
+ "# ,
362
+ r#"
363
+ fn main() {
364
+ let $0var_name = 10 > 0;
365
+ match () {
366
+ () if var_name => 1
367
+ _ => 2
368
+ };
369
+ }
370
+ "# ,
335
371
) ;
336
372
}
337
373
338
374
#[ test]
339
375
fn test_extract_var_in_closure_no_block ( ) {
376
+ cov_mark:: check!( test_extract_var_in_closure_no_block) ;
340
377
check_assist (
341
378
extract_variable,
342
- "
379
+ r# "
343
380
fn main() {
344
381
let lambda = |x: u32| $0x * 2$0;
345
382
}
346
- " ,
347
- "
383
+ "# ,
384
+ r# "
348
385
fn main() {
349
386
let lambda = |x: u32| { let $0var_name = x * 2; var_name };
350
387
}
351
- " ,
388
+ "# ,
352
389
) ;
353
390
}
354
391
355
392
#[ test]
356
393
fn test_extract_var_in_closure_with_block ( ) {
357
394
check_assist (
358
395
extract_variable,
359
- "
396
+ r# "
360
397
fn main() {
361
398
let lambda = |x: u32| { $0x * 2$0 };
362
399
}
363
- " ,
364
- "
400
+ "# ,
401
+ r# "
365
402
fn main() {
366
403
let lambda = |x: u32| { let $0var_name = x * 2; var_name };
367
404
}
368
- " ,
405
+ "# ,
369
406
) ;
370
407
}
371
408
0 commit comments