about summary refs log tree commit diff
diff options
context:
space:
mode:
authorXFFXFF <1247714429@qq.com>2022-06-11 07:02:42 +0800
committerXFFXFF <1247714429@qq.com>2022-06-11 07:11:56 +0800
commite29a6780b1f1076564a00223193fb563b644cdd7 (patch)
tree72aaa0717d575553b202b74b1693ddefc3ec720b
parentfac4d280129518d921a85ee40a56358801864cc7 (diff)
downloadrust-e29a6780b1f1076564a00223193fb563b644cdd7.tar.gz
rust-e29a6780b1f1076564a00223193fb563b644cdd7.zip
restrict the assist so that it only appears if the cursor is on the loop keyword
-rw-r--r--crates/ide-assists/src/handlers/add_label_to_loop.rs34
1 files changed, 15 insertions, 19 deletions
diff --git a/crates/ide-assists/src/handlers/add_label_to_loop.rs b/crates/ide-assists/src/handlers/add_label_to_loop.rs
index 2b32d6c1059..a14cc459899 100644
--- a/crates/ide-assists/src/handlers/add_label_to_loop.rs
+++ b/crates/ide-assists/src/handlers/add_label_to_loop.rs
@@ -1,5 +1,8 @@
 use ide_db::syntax_helpers::node_ext::for_each_break_and_continue_expr;
-use syntax::ast::{self, AstNode, HasLoopBody};
+use syntax::{
+    ast::{self, AstNode, HasLoopBody},
+    T,
+};
 
 use crate::{AssistContext, AssistId, AssistKind, Assists};
 
@@ -25,26 +28,24 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
 // }
 // ```
 pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
-    let loop_expr = ctx.find_node_at_offset::<ast::LoopExpr>()?;
+    let loop_kw = ctx.find_token_syntax_at_offset(T![loop])?;
+    let loop_expr = loop_kw.parent().and_then(ast::LoopExpr::cast)?;
     if loop_expr.label().is_some() {
         return None;
     }
-    let loop_body = loop_expr.loop_body().and_then(|it| it.stmt_list());
-    let mut related_exprs = vec![];
-    related_exprs.push(ast::Expr::LoopExpr(loop_expr.clone()));
-    for_each_break_and_continue_expr(loop_expr.label(), loop_body, &mut |expr| {
-        if let ast::Expr::BreakExpr(_) | ast::Expr::ContinueExpr(_) = expr {
-            related_exprs.push(expr)
-        }
-    });
 
     acc.add(
         AssistId("add_label_to_loop", AssistKind::Generate),
         "Add Label",
         loop_expr.syntax().text_range(),
         |builder| {
-            for expr in related_exprs {
-                match expr {
+            builder.insert(loop_kw.text_range().start(), "'l: ");
+
+            let loop_body = loop_expr.loop_body().and_then(|it| it.stmt_list());
+            for_each_break_and_continue_expr(
+                loop_expr.label(),
+                loop_body,
+                &mut |expr| match expr {
                     ast::Expr::BreakExpr(break_expr) => {
                         if let Some(break_token) = break_expr.break_token() {
                             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
                             builder.insert(continue_token.text_range().end(), " 'l")
                         }
                     }
-                    ast::Expr::LoopExpr(loop_expr) => {
-                        if let Some(loop_token) = loop_expr.loop_token() {
-                            builder.insert(loop_token.text_range().start(), "'l: ")
-                        }
-                    }
                     _ => {}
-                }
-            }
+                },
+            );
         },
     )
 }