1
1
use ide_db:: syntax_helpers:: node_ext:: for_each_break_and_continue_expr;
2
- use syntax:: ast:: { self , AstNode , HasLoopBody } ;
2
+ use syntax:: {
3
+ ast:: { self , AstNode , HasLoopBody } ,
4
+ T ,
5
+ } ;
3
6
4
7
use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
5
8
@@ -25,26 +28,24 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
25
28
// }
26
29
// ```
27
30
pub ( crate ) fn add_label_to_loop ( acc : & mut Assists , ctx : & AssistContext ) -> Option < ( ) > {
28
- let loop_expr = ctx. find_node_at_offset :: < ast:: LoopExpr > ( ) ?;
31
+ let loop_kw = ctx. find_token_syntax_at_offset ( T ! [ loop ] ) ?;
32
+ let loop_expr = loop_kw. parent ( ) . and_then ( ast:: LoopExpr :: cast) ?;
29
33
if loop_expr. label ( ) . is_some ( ) {
30
34
return None ;
31
35
}
32
- let loop_body = loop_expr. loop_body ( ) . and_then ( |it| it. stmt_list ( ) ) ;
33
- let mut related_exprs = vec ! [ ] ;
34
- related_exprs. push ( ast:: Expr :: LoopExpr ( loop_expr. clone ( ) ) ) ;
35
- for_each_break_and_continue_expr ( loop_expr. label ( ) , loop_body, & mut |expr| {
36
- if let ast:: Expr :: BreakExpr ( _) | ast:: Expr :: ContinueExpr ( _) = expr {
37
- related_exprs. push ( expr)
38
- }
39
- } ) ;
40
36
41
37
acc. add (
42
38
AssistId ( "add_label_to_loop" , AssistKind :: Generate ) ,
43
39
"Add Label" ,
44
40
loop_expr. syntax ( ) . text_range ( ) ,
45
41
|builder| {
46
- for expr in related_exprs {
47
- match expr {
42
+ builder. insert ( loop_kw. text_range ( ) . start ( ) , "'l: " ) ;
43
+
44
+ let loop_body = loop_expr. loop_body ( ) . and_then ( |it| it. stmt_list ( ) ) ;
45
+ for_each_break_and_continue_expr (
46
+ loop_expr. label ( ) ,
47
+ loop_body,
48
+ & mut |expr| match expr {
48
49
ast:: Expr :: BreakExpr ( break_expr) => {
49
50
if let Some ( break_token) = break_expr. break_token ( ) {
50
51
builder. insert ( break_token. text_range ( ) . end ( ) , " 'l" )
@@ -55,14 +56,9 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext) -> Optio
55
56
builder. insert ( continue_token. text_range ( ) . end ( ) , " 'l" )
56
57
}
57
58
}
58
- ast:: Expr :: LoopExpr ( loop_expr) => {
59
- if let Some ( loop_token) = loop_expr. loop_token ( ) {
60
- builder. insert ( loop_token. text_range ( ) . start ( ) , "'l: " )
61
- }
62
- }
63
59
_ => { }
64
- }
65
- }
60
+ } ,
61
+ ) ;
66
62
} ,
67
63
)
68
64
}
0 commit comments