1 use ide_db::syntax_helpers::node_ext::for_each_break_and_continue_expr;
3 ast::{self, AstNode, HasLoopBody},
7 use crate::{AssistContext, AssistId, AssistKind, Assists};
9 // Assist: add_label_to_loop
11 // Adds a label to a loop.
30 pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
31 let loop_kw = ctx.find_token_syntax_at_offset(T![loop])?;
32 let loop_expr = loop_kw.parent().and_then(ast::LoopExpr::cast)?;
33 if loop_expr.label().is_some() {
38 AssistId("add_label_to_loop", AssistKind::Generate),
40 loop_expr.syntax().text_range(),
42 builder.insert(loop_kw.text_range().start(), "'l: ");
44 let loop_body = loop_expr.loop_body().and_then(|it| it.stmt_list());
45 for_each_break_and_continue_expr(
48 &mut |expr| match expr {
49 ast::Expr::BreakExpr(break_expr) => {
50 if let Some(break_token) = break_expr.break_token() {
51 builder.insert(break_token.text_range().end(), " 'l")
54 ast::Expr::ContinueExpr(continue_expr) => {
55 if let Some(continue_token) = continue_expr.continue_token() {
56 builder.insert(continue_token.text_range().end(), " 'l")
68 use crate::tests::{check_assist, check_assist_not_applicable};
94 fn add_label_to_outer_loop() {
123 fn add_label_to_inner_loop() {
152 fn do_not_add_label_if_exists() {
153 check_assist_not_applicable(