1
- use std:: iter:: once;
2
-
3
1
use either:: Either ;
4
2
use hir:: { Semantics , TypeInfo } ;
5
3
use ide_db:: { RootDatabase , ty_filter:: TryEnum } ;
@@ -17,7 +15,7 @@ use syntax::{
17
15
use crate :: {
18
16
AssistId ,
19
17
assist_context:: { AssistContext , Assists } ,
20
- utils:: invert_boolean_expression_legacy,
18
+ utils:: { invert_boolean_expression_legacy, is_never_block } ,
21
19
} ;
22
20
23
21
// Assist: convert_to_guarded_return
@@ -35,9 +33,7 @@ use crate::{
35
33
// ->
36
34
// ```
37
35
// fn main() {
38
- // if !cond {
39
- // return;
40
- // }
36
+ // if !cond { return }
41
37
// foo();
42
38
// bar();
43
39
// }
@@ -54,9 +50,13 @@ fn if_expr_to_guarded_return(
54
50
acc : & mut Assists ,
55
51
ctx : & AssistContext < ' _ > ,
56
52
) -> Option < ( ) > {
57
- if if_expr. else_branch ( ) . is_some ( ) {
58
- return None ;
59
- }
53
+ let else_block = match if_expr. else_branch ( ) {
54
+ Some ( ast:: ElseBranch :: Block ( block_expr) ) if is_never_block ( & ctx. sema , & block_expr) => {
55
+ Some ( block_expr)
56
+ }
57
+ Some ( _) => return None ,
58
+ _ => None ,
59
+ } ;
60
60
61
61
let cond = if_expr. condition ( ) ?;
62
62
@@ -96,7 +96,11 @@ fn if_expr_to_guarded_return(
96
96
97
97
let parent_container = parent_block. syntax ( ) . parent ( ) ?;
98
98
99
- let early_expression: ast:: Expr = early_expression ( parent_container, & ctx. sema ) ?;
99
+ let early_expression = else_block
100
+ . or_else ( || {
101
+ early_expression ( parent_container, & ctx. sema ) . map ( ast:: make:: tail_only_block_expr)
102
+ } ) ?
103
+ . reset_indent ( ) ;
100
104
101
105
then_block. syntax ( ) . first_child_or_token ( ) . map ( |t| t. kind ( ) == T ! [ '{' ] ) ?;
102
106
@@ -123,21 +127,14 @@ fn if_expr_to_guarded_return(
123
127
&& let ( Some ( pat) , Some ( expr) ) = ( let_expr. pat ( ) , let_expr. expr ( ) )
124
128
{
125
129
// If-let.
126
- let let_else_stmt = make:: let_else_stmt (
127
- pat,
128
- None ,
129
- expr,
130
- ast:: make:: tail_only_block_expr ( early_expression. clone ( ) ) ,
131
- ) ;
130
+ let let_else_stmt =
131
+ make:: let_else_stmt ( pat, None , expr, early_expression. clone ( ) ) ;
132
132
let let_else_stmt = let_else_stmt. indent ( if_indent_level) ;
133
133
let_else_stmt. syntax ( ) . clone ( )
134
134
} else {
135
135
// If.
136
136
let new_expr = {
137
- let then_branch = make:: block_expr (
138
- once ( make:: expr_stmt ( early_expression. clone ( ) ) . into ( ) ) ,
139
- None ,
140
- ) ;
137
+ let then_branch = early_expression. clone ( ) ;
141
138
let cond = invert_boolean_expression_legacy ( expr) ;
142
139
make:: expr_if ( cond, then_branch, None ) . indent ( if_indent_level)
143
140
} ;
@@ -296,9 +293,7 @@ fn main() {
296
293
r#"
297
294
fn main() {
298
295
bar();
299
- if false {
300
- return;
301
- }
296
+ if false { return }
302
297
foo();
303
298
304
299
// comment
@@ -327,9 +322,7 @@ fn ret_option() -> Option<()> {
327
322
r#"
328
323
fn ret_option() -> Option<()> {
329
324
bar();
330
- if false {
331
- return None;
332
- }
325
+ if false { return None }
333
326
foo();
334
327
335
328
// comment
@@ -360,9 +353,7 @@ fn main() {
360
353
fn main() {
361
354
let _f = || {
362
355
bar();
363
- if false {
364
- return;
365
- }
356
+ if false { return }
366
357
foo();
367
358
368
359
// comment
@@ -421,6 +412,51 @@ fn main() {
421
412
) ;
422
413
}
423
414
415
+ #[ test]
416
+ fn convert_if_let_has_never_type_else_block ( ) {
417
+ check_assist (
418
+ convert_to_guarded_return,
419
+ r#"
420
+ fn main() {
421
+ if$0 let Ok(x) = Err(92) {
422
+ foo(x);
423
+ } else {
424
+ return ;
425
+ }
426
+ }
427
+ "# ,
428
+ r#"
429
+ fn main() {
430
+ let Ok(x) = Err(92) else {
431
+ return ;
432
+ };
433
+ foo(x);
434
+ }
435
+ "# ,
436
+ ) ;
437
+
438
+ check_assist (
439
+ convert_to_guarded_return,
440
+ r#"
441
+ fn main() {
442
+ if$0 let Ok(x) = Err(92) {
443
+ foo(x);
444
+ } else {
445
+ return
446
+ }
447
+ }
448
+ "# ,
449
+ r#"
450
+ fn main() {
451
+ let Ok(x) = Err(92) else {
452
+ return
453
+ };
454
+ foo(x);
455
+ }
456
+ "# ,
457
+ ) ;
458
+ }
459
+
424
460
#[ test]
425
461
fn convert_if_let_result_inside_let ( ) {
426
462
check_assist (
@@ -462,9 +498,7 @@ fn main() {
462
498
r#"
463
499
fn main() {
464
500
let Ok(x) = Err(92) else { return };
465
- if x >= 30 {
466
- return;
467
- }
501
+ if x >= 30 { return }
468
502
let Some(y) = Some(8) else { return };
469
503
foo(x, y);
470
504
}
@@ -487,9 +521,7 @@ fn main() {
487
521
r#"
488
522
fn main() {
489
523
let Ok(x) = Err(92) else { return };
490
- if !(x < 30 && y < 20) {
491
- return;
492
- }
524
+ if !(x < 30 && y < 20) { return }
493
525
let Some(y) = Some(8) else { return };
494
526
foo(x, y);
495
527
}
@@ -598,9 +630,7 @@ fn main() {
598
630
r#"
599
631
fn main() {
600
632
while true {
601
- if false {
602
- continue;
603
- }
633
+ if false { continue }
604
634
foo();
605
635
bar();
606
636
}
@@ -652,9 +682,7 @@ fn main() {
652
682
r#"
653
683
fn main() {
654
684
loop {
655
- if false {
656
- continue;
657
- }
685
+ if false { continue }
658
686
foo();
659
687
bar();
660
688
}
0 commit comments