1
1
use ide_db:: syntax_helpers:: node_ext:: for_each_break_and_continue_expr;
2
2
use syntax:: ast:: { self , AstNode , HasLoopBody } ;
3
- use syntax:: T ;
4
3
5
4
use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
6
5
7
- // Assist: add_lifetime_to_type
6
+ // Assist: add_label_to_loop
8
7
//
9
- // Adds a new lifetime to a struct, enum or union .
8
+ // Adds a label to a loop .
10
9
//
11
10
// ```
12
- // struct Point {
13
- // x: &u32,
14
- // y: u32,
11
+ // loop$0 {
12
+ // break;
13
+ // continue;
15
14
// }
16
15
// ```
17
16
// ->
18
17
// ```
19
- // struct Point<'a> {
20
- // x: &'a u32,
21
- // y: u32,
18
+ // 'loop: loop {
19
+ // break 'loop;
20
+ // continue 'loop;
22
21
// }
23
22
// ```
24
23
pub ( crate ) fn add_label_to_loop ( acc : & mut Assists , ctx : & AssistContext ) -> Option < ( ) > {
@@ -31,7 +30,6 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext) -> Optio
31
30
related_exprs. push ( expr)
32
31
}
33
32
} ) ;
34
- dbg ! ( loop_expr. syntax( ) . text_range( ) ) ;
35
33
36
34
acc. add (
37
35
AssistId ( "add_label_to_loop" , AssistKind :: Generate ) ,
@@ -44,25 +42,24 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext) -> Optio
44
42
if let Some ( break_token) = break_expr. break_token ( ) {
45
43
builder. insert ( break_token. text_range ( ) . end ( ) , " 'loop" )
46
44
}
47
- } ,
45
+ }
48
46
ast:: Expr :: ContinueExpr ( continue_expr) => {
49
47
if let Some ( continue_token) = continue_expr. continue_token ( ) {
50
48
builder. insert ( continue_token. text_range ( ) . end ( ) , " 'loop" )
51
49
}
52
- } ,
50
+ }
53
51
ast:: Expr :: LoopExpr ( loop_expr) => {
54
52
if let Some ( loop_token) = loop_expr. loop_token ( ) {
55
53
builder. insert ( loop_token. text_range ( ) . start ( ) , "'loop: " )
56
54
}
57
- } ,
58
- _ => todo ! ( )
55
+ }
56
+ _ => todo ! ( ) ,
59
57
}
60
58
}
61
59
} ,
62
60
)
63
61
}
64
62
65
-
66
63
#[ cfg( test) ]
67
64
mod tests {
68
65
use crate :: tests:: check_assist;
@@ -90,4 +87,61 @@ fn main() {
90
87
) ;
91
88
}
92
89
90
+ #[ test]
91
+ fn add_label_to_outer_loop ( ) {
92
+ check_assist (
93
+ add_label_to_loop,
94
+ r#"
95
+ fn main() {
96
+ loop$0 {
97
+ break;
98
+ continue;
99
+ loop {
100
+ break;
101
+ continue;
102
+ }
103
+ }
104
+ }"# ,
105
+ r#"
106
+ fn main() {
107
+ 'loop: loop {
108
+ break 'loop;
109
+ continue 'loop;
110
+ loop {
111
+ break;
112
+ continue;
113
+ }
114
+ }
115
+ }"# ,
116
+ ) ;
117
+ }
118
+
119
+ #[ test]
120
+ fn add_label_to_inner_loop ( ) {
121
+ check_assist (
122
+ add_label_to_loop,
123
+ r#"
124
+ fn main() {
125
+ loop {
126
+ break;
127
+ continue;
128
+ loop$0 {
129
+ break;
130
+ continue;
131
+ }
132
+ }
133
+ }"# ,
134
+ r#"
135
+ fn main() {
136
+ loop {
137
+ break;
138
+ continue;
139
+ 'loop: loop {
140
+ break 'loop;
141
+ continue 'loop;
142
+ }
143
+ }
144
+ }"# ,
145
+ ) ;
146
+ }
93
147
}
0 commit comments