@@ -8,20 +8,27 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
88// Adds a label to a loop.
99//
1010// ```
11- // loop$0 {
12- // break;
13- // continue;
11+ // fn main() {
12+ // loop$0 {
13+ // break;
14+ // continue;
15+ // }
1416// }
1517// ```
1618// ->
1719// ```
18- // 'loop: loop {
19- // break 'loop;
20- // continue 'loop;
20+ // fn main() {
21+ // 'loop: loop {
22+ // break 'loop;
23+ // continue 'loop;
24+ // }
2125// }
2226// ```
2327pub ( crate ) fn add_label_to_loop ( acc : & mut Assists , ctx : & AssistContext ) -> Option < ( ) > {
2428 let loop_expr = ctx. find_node_at_offset :: < ast:: LoopExpr > ( ) ?;
29+ if loop_expr. label ( ) . is_some ( ) {
30+ return None ;
31+ }
2532 let loop_body = loop_expr. loop_body ( ) . and_then ( |it| it. stmt_list ( ) ) ;
2633 let mut related_exprs = vec ! [ ] ;
2734 related_exprs. push ( ast:: Expr :: LoopExpr ( loop_expr. clone ( ) ) ) ;
@@ -53,7 +60,7 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext) -> Optio
5360 builder. insert ( loop_token. text_range ( ) . start ( ) , "'loop: " )
5461 }
5562 }
56- _ => todo ! ( ) ,
63+ _ => { }
5764 }
5865 }
5966 } ,
@@ -62,7 +69,7 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext) -> Optio
6269
6370#[ cfg( test) ]
6471mod tests {
65- use crate :: tests:: check_assist;
72+ use crate :: tests:: { check_assist, check_assist_not_applicable } ;
6673
6774 use super :: * ;
6875
@@ -72,16 +79,16 @@ mod tests {
7279 add_label_to_loop,
7380 r#"
7481fn main() {
75- loop$0 {
76- break;
77- continue;
82+ loop$0 {
83+ break;
84+ continue;
7885 }
7986}"# ,
8087 r#"
8188fn main() {
82- 'loop: loop {
83- break 'loop;
84- continue 'loop;
89+ 'loop: loop {
90+ break 'loop;
91+ continue 'loop;
8592 }
8693}"# ,
8794 ) ;
@@ -93,9 +100,9 @@ fn main() {
93100 add_label_to_loop,
94101 r#"
95102fn main() {
96- loop$0 {
97- break;
98- continue;
103+ loop$0 {
104+ break;
105+ continue;
99106 loop {
100107 break;
101108 continue;
@@ -104,9 +111,9 @@ fn main() {
104111}"# ,
105112 r#"
106113fn main() {
107- 'loop: loop {
108- break 'loop;
109- continue 'loop;
114+ 'loop: loop {
115+ break 'loop;
116+ continue 'loop;
110117 loop {
111118 break;
112119 continue;
@@ -122,9 +129,9 @@ fn main() {
122129 add_label_to_loop,
123130 r#"
124131fn main() {
125- loop {
126- break;
127- continue;
132+ loop {
133+ break;
134+ continue;
128135 loop$0 {
129136 break;
130137 continue;
@@ -133,14 +140,28 @@ fn main() {
133140}"# ,
134141 r#"
135142fn main() {
136- loop {
137- break;
138- continue;
143+ loop {
144+ break;
145+ continue;
139146 'loop: loop {
140147 break 'loop;
141148 continue 'loop;
142149 }
143150 }
151+ }"# ,
152+ ) ;
153+ }
154+
155+ #[ test]
156+ fn do_not_add_label_if_exists ( ) {
157+ check_assist_not_applicable (
158+ add_label_to_loop,
159+ r#"
160+ fn main() {
161+ 'loop: loop$0 {
162+ break 'loop;
163+ continue 'loop;
164+ }
144165}"# ,
145166 ) ;
146167 }
0 commit comments