File tree Expand file tree Collapse file tree 1 file changed +77
-0
lines changed
crates/ide-completion/src/completions Expand file tree Collapse file tree 1 file changed +77
-0
lines changed Original file line number Diff line number Diff line change @@ -75,6 +75,11 @@ pub(crate) fn complete_postfix(
75
75
76
76
let try_enum = TryEnum :: from_ty ( & ctx. sema , & receiver_ty. strip_references ( ) ) ;
77
77
if let Some ( try_enum) = & try_enum {
78
+ let in_loop = dot_receiver
79
+ . syntax ( )
80
+ . ancestors ( )
81
+ . any ( |n| matches ! ( n. kind( ) , WHILE_EXPR | LOOP_EXPR | FOR_EXPR ) ) ;
82
+
78
83
match try_enum {
79
84
TryEnum :: Result => {
80
85
postfix_snippet (
@@ -84,6 +89,17 @@ pub(crate) fn complete_postfix(
84
89
)
85
90
. add_to ( acc, ctx. db ) ;
86
91
92
+ postfix_snippet (
93
+ "lete" ,
94
+ "let Ok else {}" ,
95
+ & if in_loop {
96
+ format ! ( "let Ok($1) = {receiver_text} else {{\n ${{2|continue,break,return|}};\n }};\n $0" )
97
+ } else {
98
+ format ! ( "let Ok($1) = {receiver_text} else {{\n return;\n }};\n $0" )
99
+ } ,
100
+ )
101
+ . add_to ( acc, ctx. db ) ;
102
+
87
103
postfix_snippet (
88
104
"while" ,
89
105
"while let Ok {}" ,
@@ -99,6 +115,17 @@ pub(crate) fn complete_postfix(
99
115
)
100
116
. add_to ( acc, ctx. db ) ;
101
117
118
+ postfix_snippet (
119
+ "lete" ,
120
+ "let Some else {}" ,
121
+ & if in_loop {
122
+ format ! ( "let Some($1) = {receiver_text} else {{\n ${{2|continue,break,return|}};\n }};\n $0" )
123
+ } else {
124
+ format ! ( "let Some($1) = {receiver_text} else {{\n return;\n }};\n $0" )
125
+ } ,
126
+ )
127
+ . add_to ( acc, ctx. db ) ;
128
+
102
129
postfix_snippet (
103
130
"while" ,
104
131
"while let Some {}" ,
@@ -469,6 +496,56 @@ fn main() {
469
496
) ;
470
497
}
471
498
499
+ #[ test]
500
+ fn option_letelse ( ) {
501
+ check_edit (
502
+ "lete" ,
503
+ r#"
504
+ //- minicore: option
505
+ fn main() {
506
+ let bar = Some(true);
507
+ bar.$0
508
+ }
509
+ "# ,
510
+ r#"
511
+ fn main() {
512
+ let bar = Some(true);
513
+ let Some($1) = bar else {
514
+ return;
515
+ };
516
+ $0
517
+ }
518
+ "# ,
519
+ ) ;
520
+ }
521
+
522
+ #[ test]
523
+ fn option_letelse_loop ( ) {
524
+ check_edit (
525
+ "lete" ,
526
+ r#"
527
+ //- minicore: option
528
+ fn main() {
529
+ let bar = Some(true);
530
+ loop {
531
+ bar.$0
532
+ }
533
+ }
534
+ "# ,
535
+ r#"
536
+ fn main() {
537
+ let bar = Some(true);
538
+ loop {
539
+ let Some($1) = bar else {
540
+ ${2|continue,break,return|};
541
+ };
542
+ $0
543
+ }
544
+ }
545
+ "# ,
546
+ ) ;
547
+ }
548
+
472
549
#[ test]
473
550
fn result_match ( ) {
474
551
check_edit (
You can’t perform that action at this time.
0 commit comments