Skip to content

Commit e29a678

Browse files
committed
restrict the assist so that it only appears if the cursor is on the loop keyword
1 parent fac4d28 commit e29a678

File tree

1 file changed

+15
-19
lines changed

1 file changed

+15
-19
lines changed

crates/ide-assists/src/handlers/add_label_to_loop.rs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
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+
};
36

47
use crate::{AssistContext, AssistId, AssistKind, Assists};
58

@@ -25,26 +28,24 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
2528
// }
2629
// ```
2730
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)?;
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

Comments
 (0)