11use 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+ } ;
36
47use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
58
@@ -25,26 +28,24 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
2528// }
2629// ```
2730pub ( 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) ?;
2933 if loop_expr. label ( ) . is_some ( ) {
3034 return None ;
3135 }
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- } ) ;
4036
4137 acc. add (
4238 AssistId ( "add_label_to_loop" , AssistKind :: Generate ) ,
4339 "Add Label" ,
4440 loop_expr. syntax ( ) . text_range ( ) ,
4541 |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 {
4849 ast:: Expr :: BreakExpr ( break_expr) => {
4950 if let Some ( break_token) = break_expr. break_token ( ) {
5051 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
5556 builder. insert ( continue_token. text_range ( ) . end ( ) , " 'l" )
5657 }
5758 }
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- }
6359 _ => { }
64- }
65- }
60+ } ,
61+ ) ;
6662 } ,
6763 )
6864}
0 commit comments