11use ide_db:: syntax_helpers:: node_ext:: for_each_break_and_continue_expr;
22use syntax:: ast:: { self , AstNode , HasLoopBody } ;
3- use syntax:: T ;
43
54use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
65
7- // Assist: add_lifetime_to_type
6+ // Assist: add_label_to_loop
87//
9- // Adds a new lifetime to a struct, enum or union .
8+ // Adds a label to a loop .
109//
1110// ```
12- // struct Point {
13- // x: &u32,
14- // y: u32,
11+ // loop$0 {
12+ // break;
13+ // continue;
1514// }
1615// ```
1716// ->
1817// ```
19- // struct Point<'a> {
20- // x: &'a u32,
21- // y: u32,
18+ // 'loop: loop {
19+ // break 'loop;
20+ // continue 'loop;
2221// }
2322// ```
2423pub ( 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
3130 related_exprs. push ( expr)
3231 }
3332 } ) ;
34- dbg ! ( loop_expr. syntax( ) . text_range( ) ) ;
3533
3634 acc. add (
3735 AssistId ( "add_label_to_loop" , AssistKind :: Generate ) ,
@@ -44,25 +42,24 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext) -> Optio
4442 if let Some ( break_token) = break_expr. break_token ( ) {
4543 builder. insert ( break_token. text_range ( ) . end ( ) , " 'loop" )
4644 }
47- } ,
45+ }
4846 ast:: Expr :: ContinueExpr ( continue_expr) => {
4947 if let Some ( continue_token) = continue_expr. continue_token ( ) {
5048 builder. insert ( continue_token. text_range ( ) . end ( ) , " 'loop" )
5149 }
52- } ,
50+ }
5351 ast:: Expr :: LoopExpr ( loop_expr) => {
5452 if let Some ( loop_token) = loop_expr. loop_token ( ) {
5553 builder. insert ( loop_token. text_range ( ) . start ( ) , "'loop: " )
5654 }
57- } ,
58- _ => todo ! ( )
55+ }
56+ _ => todo ! ( ) ,
5957 }
6058 }
6159 } ,
6260 )
6361}
6462
65-
6663#[ cfg( test) ]
6764mod tests {
6865 use crate :: tests:: check_assist;
@@ -90,4 +87,61 @@ fn main() {
9087 ) ;
9188 }
9289
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+ }
93147}
0 commit comments