Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/highlight_related.rs')
-rw-r--r--crates/ide/src/highlight_related.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/crates/ide/src/highlight_related.rs b/crates/ide/src/highlight_related.rs
index 8f84f35bb4..bb96c92519 100644
--- a/crates/ide/src/highlight_related.rs
+++ b/crates/ide/src/highlight_related.rs
@@ -232,6 +232,23 @@ fn highlight_references(
}
}
+ // highlight the tail expr of the labelled block
+ if matches!(def, Definition::Label(_)) {
+ let label = token.parent_ancestors().nth(1).and_then(ast::Label::cast);
+ if let Some(block) =
+ label.and_then(|label| label.syntax().parent()).and_then(ast::BlockExpr::cast)
+ {
+ for_each_tail_expr(&block.into(), &mut |tail| {
+ if !matches!(tail, ast::Expr::BreakExpr(_)) {
+ res.insert(HighlightedRange {
+ range: tail.syntax().text_range(),
+ category: ReferenceCategory::empty(),
+ });
+ }
+ });
+ }
+ }
+
// highlight the defs themselves
match def {
Definition::Local(local) => {
@@ -2101,4 +2118,24 @@ fn foo() {
"#,
);
}
+
+ #[test]
+ fn labeled_block_tail_expr_2() {
+ check(
+ r#"
+fn foo() {
+ let _ = 'b$0lk: {
+ // ^^^^
+ let x = 1;
+ if true { break 'blk 42; }
+ // ^^^^
+ if false { break 'blk 24; }
+ // ^^^^
+ 100
+ // ^^^
+ };
+}
+"#,
+ );
+ }
}