Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
9b6afcf
Fix indent for convert_closure_to_fn
A4-Tacks Sep 2, 2025
9bc8e4e
Add applicable on LetExpr for unwrap_tuple
A4-Tacks Sep 3, 2025
293e8d3
Fix not applicable on empty struct for no_such_field
A4-Tacks Sep 5, 2025
04b232a
Add wrap multiple attr for wrap_unwrap_cfg_attr
A4-Tacks Sep 7, 2025
2b3e319
Add nested lifetime support for add_lifetime_to_type
A4-Tacks Sep 8, 2025
5cd99fb
Add fixes for non_exhaustive_let diagnostic
A4-Tacks Sep 29, 2025
c55a224
Support unmap macro expansion
A4-Tacks Oct 26, 2025
440cb96
Support WhileExpr and ForExpr for add_label_to_loop
A4-Tacks Nov 7, 2025
f4334bb
stdx indent and dedent utils
A4-Tacks Dec 23, 2025
ad4e1c2
Fix postfix completion indentation compensation
A4-Tacks Dec 23, 2025
430468f
Fix tuple struct pat expected type
A4-Tacks Dec 25, 2025
e04b950
change test_name placeholder to executable_arg
dfireBird Jan 3, 2026
b21e115
Add a test for parsing BuildData and RunnableData json
cormacrelf Jan 9, 2026
557df27
Privatise some fields and structs in project_json
cormacrelf Jan 8, 2026
b801b88
Add unknown runnable kind for forwards compatibility
cormacrelf Jan 8, 2026
f8455e2
A comment to help ProjectJsonData stay backwards-compatible
cormacrelf Jan 8, 2026
ff365fd
Refactor the runnable_args implementation to be more compact
cormacrelf Jan 9, 2026
91819d0
Restore a deleted comment that was quite informative
cormacrelf Jan 8, 2026
f8d046d
Support more runnable kinds for project json
cormacrelf Jan 9, 2026
8ec0c96
Add partial selection for merge_imports
A4-Tacks Aug 29, 2025
529c83d
Add applicable on let-else branch for unwrap_block
A4-Tacks Jan 15, 2026
8788034
feat: complete block .let in closure expression
A4-Tacks Mar 5, 2026
835c745
internal: shortcuit simple current parameter
A4-Tacks Mar 6, 2026
923582c
fix: add ident_pat qualifier to fully fn param
A4-Tacks Mar 6, 2026
80fa2b5
feat: offer on let-expr for inline_local_variable
A4-Tacks Mar 7, 2026
901cb4c
fix: implement ir_print debug for next-solver predicate types
Albab-Hasan Mar 7, 2026
e4e8ae7
fix: qualify NormalizesTo and CoercePredicate in ir_print debug output
Albab-Hasan Mar 8, 2026
0adea80
Fix other predicate for replace_is_method_with_if_let_method
A4-Tacks Mar 9, 2026
005a1ed
internal: Fix test_loading_rust_analyzer when rust-project.json is pr…
Wilfred Mar 10, 2026
201bbb3
fix: offer on const like path-expr for 'extract_variable'
A4-Tacks Mar 13, 2026
5e62d4f
Bump undici from 6.21.3 to 6.24.1 in /editors/code
dependabot[bot] Mar 14, 2026
c34e7ff
Migrate 'convert_named_struct_to_tuple_struct' assist
A4-Tacks Mar 14, 2026
31f31ab
Fix overlap edit on record to tuple assist uses self
A4-Tacks Mar 11, 2026
4aa2d6f
Fix field ref in macro for 'convert_tuple_struct_to_named_struct'
A4-Tacks Mar 14, 2026
77a2014
Fix overlap edit on tuple to record assist expr uses self
A4-Tacks Mar 14, 2026
ed15a20
fix: fill match arms on last comma and empty expr
A4-Tacks Mar 15, 2026
1bc2c44
fix: remove empty angle brackets in inline type alias code assist.
80avin Mar 8, 2026
8dba85c
update wrap_expr in utils ref_field_expr and update corresponding han…
Shourya742 Mar 16, 2026
7f3bc0b
update wrap_block to accept SyntaxFactory and correspondingly update …
Shourya742 Mar 16, 2026
d6b3207
convert_param_list_to_arg_list accept syntaxFactory and update the co…
Shourya742 Mar 16, 2026
f2bc624
update convert_param_list_to_arg_list to get ArgList via make
Shourya742 Mar 16, 2026
cc02838
add syntaxFactory to tt_from_syntax and update corresponding handlers
Shourya742 Mar 16, 2026
4e50d13
remove invert_boolean_expression_legacy
Shourya742 Mar 16, 2026
f5836b5
make insert_attribute accept syntaxFactory
Shourya742 Mar 16, 2026
fc73d18
Merge pull request #21815 from rust-lang/dependabot/npm_and_yarn/edit…
lnicola Mar 16, 2026
f01a047
Merge pull request #21784 from 80avin/fix-inline-type-assist
A4-Tacks Mar 16, 2026
637cc71
Don't trigger GC on slow tests
ChayimFriedman2 Mar 16, 2026
1b48210
Merge pull request #21827 from ChayimFriedman2/multiprocess-slow-tests
Veykril Mar 16, 2026
b7bc962
fix: SCIP generation should prime caches in parallel
Wilfred Mar 13, 2026
5fe6600
add mappings for constructors
Shourya742 Mar 16, 2026
f926929
Merge pull request #21828 from Wilfred/parallel_prime_caches_scip
ChayimFriedman2 Mar 16, 2026
60207de
small clean-up
ada4a Mar 12, 2026
607d64a
Merge pull request #21829 from ada4a/push-zwprmlkyptmx
lnicola Mar 16, 2026
1cd4c2a
Merge pull request #21826 from Shourya742/2026-02-03-migrate-utils-to…
A4-Tacks Mar 16, 2026
0d35d9c
add mapping to struct_ syntax_factory constructor method
Shourya742 Mar 17, 2026
7c21a38
add mapping to enum_ syntax_factory constructor method
Shourya742 Mar 17, 2026
ea2bebd
add mapping to unnamed_param syntax_factory constructor method
Shourya742 Mar 17, 2026
9c6a66d
add mapping to ty_fn_ptr syntax_factory constructor method
Shourya742 Mar 17, 2026
597f11b
add mapping to where_pred syntax_factory constructor method
Shourya742 Mar 17, 2026
16949c5
add mapping to where_clause syntax_factory constructor method
Shourya742 Mar 17, 2026
3e9dc4e
add mapping to impl_trait_type syntax_factory constructor method
Shourya742 Mar 17, 2026
f3f1448
add mapping to generic_ty_path_segment syntax_factory constructor method
Shourya742 Mar 17, 2026
4ed8442
add mapping to tail_only_block_expr syntax_factory constructor method
Shourya742 Mar 17, 2026
7a5d26d
add mapping to expr_bin_op syntax_factory constructor method
Shourya742 Mar 17, 2026
01716dd
add mapping to use_ syntax_factory constructor method
Shourya742 Mar 17, 2026
ec8ab85
add mapping to use_tree syntax_factory constructor method
Shourya742 Mar 17, 2026
257bcc4
remove redundant enum_ constructor
Shourya742 Mar 17, 2026
7c93774
internal: Add codecov badge
Wilfred Mar 10, 2026
be963fb
Merge pull request #21796 from Wilfred/codecov_badge
lnicola Mar 17, 2026
9d9f68f
fix: .let no complete semicolon before semicolon
A4-Tacks Mar 18, 2026
b0d4f7a
Migrate convert_from_to_tryfrom assist to SyntaxEditor API
sengmonkham Mar 18, 2026
191969d
remove outdated TODO
ada4a Mar 19, 2026
3e35ce4
Merge pull request #21845 from ada4a/push-yoxkrkvpupkl
ChayimFriedman2 Mar 19, 2026
e5c44d0
Merge pull request #21843 from sengmonkham/gsoc/migrate-convert-from-…
ChayimFriedman2 Mar 20, 2026
54819a1
migrate qualify_path to use SyntaxEditor and SyntaxFactory
Shourya742 Mar 20, 2026
4307825
remove direct make usage in add_label_to_loop via syntaxFactory
Shourya742 Mar 20, 2026
61be42c
migrate desugar_try_expr to use syntax editor and syntax Factory
Shourya742 Mar 20, 2026
345a80f
remove use make directly from extract_variable assist
Shourya742 Mar 20, 2026
6c82469
migrate qualify_method_call to use syntaxEditor and SyntaxFactory
Shourya742 Mar 20, 2026
eabc019
remove mapping for expr underscore in syntax factory constructor
Shourya742 Mar 20, 2026
09197c9
Merge pull request #21839 from A4-Tacks/dedup-comp-postfix-let-semi
ChayimFriedman2 Mar 20, 2026
fb84963
Merge pull request #21848 from Shourya742/2026-03-20-remove-mapping-e…
ChayimFriedman2 Mar 20, 2026
03ea352
Merge pull request #21779 from Albab-Hasan/fix/next-solver-ir-print
ChayimFriedman2 Mar 20, 2026
4a18159
Merge pull request #21775 from A4-Tacks/inline-let-expr
ChayimFriedman2 Mar 20, 2026
b161e51
Merge pull request #20614 from A4-Tacks/diag-not-apply-empty-struct-n…
ChayimFriedman2 Mar 20, 2026
b015909
Merge pull request #21756 from A4-Tacks/fallback-let-closure
ChayimFriedman2 Mar 20, 2026
378fcb3
Merge pull request #21787 from A4-Tacks/replace-is-some-and-fallback
ChayimFriedman2 Mar 20, 2026
fbb8d2d
Merge pull request #20566 from A4-Tacks/part-selection-merge-uses
ChayimFriedman2 Mar 20, 2026
7e6a279
Merge pull request #20594 from A4-Tacks/conv-clos-to-fn-indent
ChayimFriedman2 Mar 20, 2026
4c93d12
Merge pull request #20600 from A4-Tacks/unwrap-tuple-on-let-expr
ChayimFriedman2 Mar 20, 2026
ca1fc35
Remove doc comments for generate_trait_from_impl
A4-Tacks Aug 8, 2025
69a0120
Merge pull request #20407 from A4-Tacks/remove-doc-for-gen-trait
A4-Tacks Mar 20, 2026
f17bfda
Merge pull request #21768 from A4-Tacks/complete-fully-param-qualifier
ChayimFriedman2 Mar 20, 2026
3d3302c
Merge pull request #20625 from A4-Tacks/multi-attr-to-cfg_attr
ChayimFriedman2 Mar 20, 2026
04b7a5a
Merge pull request #21822 from A4-Tacks/tail-offer-fill-match-arm
ChayimFriedman2 Mar 20, 2026
c01af5a
Add `ops::AddAssign` implement for IndentLevel
A4-Tacks Sep 3, 2025
6294bbc
Merge pull request #20601 from A4-Tacks/indent-level-add-assign
A4-Tacks Mar 20, 2026
eee8bdd
Add auto trait name for generate_trait_from_impl
A4-Tacks Jul 24, 2025
a307600
Do not suggest trait name on multi fn
A4-Tacks Mar 20, 2026
ff57969
Merge pull request #20299 from A4-Tacks/auto-trait-name-for-gen-trait…
A4-Tacks Mar 20, 2026
03ecc85
Merge pull request #21333 from A4-Tacks/expected-tuple-struct-pat
Veykril Mar 20, 2026
ee041a3
add without_mappings variant in let_expr_needs_paren
Shourya742 Mar 20, 2026
7486788
Merge pull request #21847 from Shourya742/2026-03-20-migrate-assist
A4-Tacks Mar 20, 2026
ed0a99f
Merge pull request #21832 from Shourya742/2026-03-04-add-mapping-to-c…
A4-Tacks Mar 21, 2026
c1a24b4
ide-assists: add tests for const, static in add_braces
Amit5601 Mar 21, 2026
9bff35b
add tests for let-expr in add_braces
A4-Tacks Mar 21, 2026
dc8d64d
feat: offer 'add_braces' on bin-expr assignment
A4-Tacks Mar 21, 2026
734914e
Merge pull request #21850 from A4-Tacks/add-braces-bin-expr
A4-Tacks Mar 21, 2026
1a05c11
Bump flatted from 3.3.3 to 3.4.2 in /editors/code
dependabot[bot] Mar 21, 2026
77aac00
Merge pull request #21817 from A4-Tacks/conv-struct-to-tuple-uses-self
A4-Tacks Mar 21, 2026
f1c710b
internal: Remove clone_for_update from apply_demorgan.rs
Amit5601 Mar 22, 2026
bde4008
Merge pull request #21854 from Amit5601/remove-mut-tree-demorgan
A4-Tacks Mar 22, 2026
6eb75b7
Merge pull request #20628 from A4-Tacks/add-lifetime-for-infer
ChayimFriedman2 Mar 22, 2026
bbec9ac
Merge pull request #20762 from A4-Tacks/non-exhaustive-let-fixes
ChayimFriedman2 Mar 22, 2026
9d74e3c
Merge pull request #20984 from A4-Tacks/add-label-while-for
ChayimFriedman2 Mar 22, 2026
a7f691e
Merge pull request #21324 from A4-Tacks/dedent-dot-comp-snippet
ChayimFriedman2 Mar 22, 2026
9e22fa4
Merge pull request #21395 from dfireBird/push-sqrmpnzrzwpt
ChayimFriedman2 Mar 22, 2026
470b725
Merge pull request #21423 from cormacrelf/project-json-compatibility
ChayimFriedman2 Mar 22, 2026
c070408
Merge pull request #21424 from cormacrelf/support-more-runnable-kinds
ChayimFriedman2 Mar 22, 2026
0087e3e
Merge pull request #21473 from A4-Tacks/unwrap-let-else-block
ChayimFriedman2 Mar 22, 2026
7606287
Merge pull request #21809 from A4-Tacks/extract-const-like-path-expr
ChayimFriedman2 Mar 22, 2026
a022c19
Merge pull request #21851 from rust-lang/dependabot/npm_and_yarn/edit…
ChayimFriedman2 Mar 22, 2026
c9a65cf
Merge pull request #21795 from Wilfred/fix_unit_test_rust_project
ChayimFriedman2 Mar 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/tools/rust-analyzer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ analyzing Rust code. See
[Architecture](https://rust-analyzer.github.io/book/contributing/architecture.html)
in the manual.

[![codecov](https://codecov.io/github/rust-lang/rust-analyzer/graph/badge.svg)](https://app.codecov.io/github/rust-lang/rust-analyzer/tree/master)

## Quick Start

https://rust-analyzer.github.io/book/installation.html
Expand Down
29 changes: 20 additions & 9 deletions src/tools/rust-analyzer/crates/hir-ty/src/next_solver/ir_print.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
//! Things related to IR printing in the next-trait-solver.

use std::any::type_name_of_val;

use rustc_type_ir::{self as ty, ir_print::IrPrint};

use super::SolverDefId;
Expand Down Expand Up @@ -82,7 +80,10 @@ impl<'db> IrPrint<ty::TraitPredicate<Self>> for DbInterner<'db> {
t: &ty::TraitPredicate<Self>,
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
match t.polarity {
ty::PredicatePolarity::Positive => write!(fmt, "{:?}", t.trait_ref),
ty::PredicatePolarity::Negative => write!(fmt, "!{:?}", t.trait_ref),
}
}
}
impl<'db> IrPrint<rustc_type_ir::HostEffectPredicate<Self>> for DbInterner<'db> {
Expand All @@ -97,7 +98,11 @@ impl<'db> IrPrint<rustc_type_ir::HostEffectPredicate<Self>> for DbInterner<'db>
t: &rustc_type_ir::HostEffectPredicate<Self>,
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
let prefix = match t.constness {
ty::BoundConstness::Const => "const",
ty::BoundConstness::Maybe => "[const]",
};
write!(fmt, "{prefix} {:?}", t.trait_ref)
}
}
impl<'db> IrPrint<ty::ExistentialTraitRef<Self>> for DbInterner<'db> {
Expand Down Expand Up @@ -183,7 +188,7 @@ impl<'db> IrPrint<ty::NormalizesTo<Self>> for DbInterner<'db> {
t: &ty::NormalizesTo<Self>,
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
write!(fmt, "NormalizesTo({} -> {:?})", t.alias, t.term)
}
}
impl<'db> IrPrint<ty::SubtypePredicate<Self>> for DbInterner<'db> {
Expand All @@ -198,7 +203,7 @@ impl<'db> IrPrint<ty::SubtypePredicate<Self>> for DbInterner<'db> {
t: &ty::SubtypePredicate<Self>,
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
write!(fmt, "{:?} <: {:?}", t.a, t.b)
}
}
impl<'db> IrPrint<ty::CoercePredicate<Self>> for DbInterner<'db> {
Expand All @@ -210,7 +215,7 @@ impl<'db> IrPrint<ty::CoercePredicate<Self>> for DbInterner<'db> {
t: &ty::CoercePredicate<Self>,
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
write!(fmt, "CoercePredicate({:?} -> {:?})", t.a, t.b)
}
}
impl<'db> IrPrint<ty::FnSig<Self>> for DbInterner<'db> {
Expand All @@ -219,7 +224,9 @@ impl<'db> IrPrint<ty::FnSig<Self>> for DbInterner<'db> {
}

fn print_debug(t: &ty::FnSig<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
let tys = t.inputs_and_output.as_slice();
let (output, inputs) = tys.split_last().unwrap();
write!(fmt, "fn({:?}) -> {:?}", inputs, output)
}
}

Expand All @@ -235,6 +242,10 @@ impl<'db> IrPrint<rustc_type_ir::PatternKind<DbInterner<'db>>> for DbInterner<'d
t: &rustc_type_ir::PatternKind<DbInterner<'db>>,
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
fmt.write_str(&format!("TODO: {:?}", type_name_of_val(t)))
match t {
ty::PatternKind::Range { start, end } => write!(fmt, "{:?}..={:?}", start, end),
ty::PatternKind::Or(list) => write!(fmt, "or({:?})", list),
ty::PatternKind::NotNull => fmt.write_str("!null"),
}
}
}
14 changes: 0 additions & 14 deletions src/tools/rust-analyzer/crates/hir/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,6 @@ macro_rules! diagnostics {
)*
};
}
// FIXME Accept something like the following in the macro call instead
// diagnostics![
// pub struct BreakOutsideOfLoop {
// pub expr: InFile<AstPtr<ast::Expr>>,
// pub is_break: bool,
// pub bad_value_break: bool,
// }, ...
// or more concisely
// BreakOutsideOfLoop {
// expr: InFile<AstPtr<ast::Expr>>,
// is_break: bool,
// bad_value_break: bool,
// }, ...
// ]

diagnostics![AnyDiagnostic<'db> ->
AwaitOutsideOfAsync,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ fn get_replacement_node(ctx: &AssistContext<'_>) -> Option<(ParentType, ast::Exp
match parent {
ast::LetStmt(it) => it.initializer()?,
ast::LetExpr(it) => it.expr()?,
ast::BinExpr(it) => it.rhs()?,
ast::Static(it) => it.body()?,
ast::Const(it) => it.body()?,
_ => return None,
Expand Down Expand Up @@ -174,6 +175,70 @@ fn foo() {
n + 100
};
}
"#,
);

check_assist(
add_braces,
r#"
fn foo() {
let x;
x =$0 n + 100;
}
"#,
r#"
fn foo() {
let x;
x = {
n + 100
};
}
"#,
);

check_assist(
add_braces,
r#"
fn foo() {
if let x =$0 n + 100 {}
}
"#,
r#"
fn foo() {
if let x = {
n + 100
} {}
}
"#,
);
}

#[test]
fn suggest_add_braces_for_const_initializer() {
check_assist(
add_braces,
r#"
const X: i32 =$0 1 + 2;
"#,
r#"
const X: i32 = {
1 + 2
};
"#,
);
}

#[test]
fn suggest_add_braces_for_static_initializer() {
check_assist(
add_braces,
r#"
static X: i32 $0= 1 + 2;
"#,
r#"
static X: i32 = {
1 + 2
};
"#,
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,7 @@ use ide_db::{
};
use syntax::{
SyntaxToken, T,
ast::{
self, AstNode, HasLoopBody,
make::{self, tokens},
syntax_factory::SyntaxFactory,
},
ast::{self, AstNode, HasLoopBody, syntax_factory::SyntaxFactory},
syntax_editor::{Position, SyntaxEditor},
};

Expand Down Expand Up @@ -35,9 +31,9 @@ use crate::{AssistContext, AssistId, Assists};
// }
// ```
pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
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() {
let loop_expr = ctx.find_node_at_offset::<ast::AnyHasLoopBody>()?;
let loop_kw = loop_token(&loop_expr)?;
if loop_expr.label().is_some() || !loop_kw.text_range().contains_inclusive(ctx.offset()) {
return None;
}

Expand All @@ -52,8 +48,8 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
let label = make.lifetime("'l");
let elements = vec![
label.syntax().clone().into(),
make::token(T![:]).into(),
tokens::single_space().into(),
make.token(T![:]).into(),
make.whitespace(" ").into(),
];
editor.insert_all(Position::before(&loop_kw), elements);

Expand All @@ -80,6 +76,14 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
)
}

fn loop_token(loop_expr: &ast::AnyHasLoopBody) -> Option<syntax::SyntaxToken> {
loop_expr
.syntax()
.children_with_tokens()
.filter_map(|it| it.into_token())
.find(|it| matches!(it.kind(), T![for] | T![loop] | T![while]))
}

fn insert_label_after_token(
editor: &mut SyntaxEditor,
make: &SyntaxFactory,
Expand All @@ -88,7 +92,7 @@ fn insert_label_after_token(
builder: &mut SourceChangeBuilder,
) {
let label = make.lifetime("'l");
let elements = vec![tokens::single_space().into(), label.syntax().clone().into()];
let elements = vec![make.whitespace(" ").into(), label.syntax().clone().into()];
editor.insert_all(Position::after(token), elements);

if let Some(cap) = ctx.config.snippet_cap {
Expand Down Expand Up @@ -123,6 +127,48 @@ fn main() {
);
}

#[test]
fn add_label_to_while_expr() {
check_assist(
add_label_to_loop,
r#"
fn main() {
while$0 true {
break;
continue;
}
}"#,
r#"
fn main() {
${1:'l}: while true {
break ${2:'l};
continue ${0:'l};
}
}"#,
);
}

#[test]
fn add_label_to_for_expr() {
check_assist(
add_label_to_loop,
r#"
fn main() {
for$0 _ in 0..5 {
break;
continue;
}
}"#,
r#"
fn main() {
${1:'l}: for _ in 0..5 {
break ${2:'l};
continue ${0:'l};
}
}"#,
);
}

#[test]
fn add_label_to_outer_loop() {
check_assist(
Expand Down Expand Up @@ -191,6 +237,31 @@ fn main() {
break 'l;
continue 'l;
}
}"#,
);
}

#[test]
fn do_not_add_label_if_outside_keyword() {
check_assist_not_applicable(
add_label_to_loop,
r#"
fn main() {
'l: loop {$0
break 'l;
continue 'l;
}
}"#,
);

check_assist_not_applicable(
add_label_to_loop,
r#"
fn main() {
'l: while true {$0
break 'l;
continue 'l;
}
}"#,
);
}
Expand Down
Loading
Loading