about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/tools/rust-analyzer/crates/ide/src/goto_definition.rs18
-rw-r--r--src/tools/rust-analyzer/crates/ide/src/highlight_related.rs42
2 files changed, 47 insertions, 13 deletions
diff --git a/src/tools/rust-analyzer/crates/ide/src/goto_definition.rs b/src/tools/rust-analyzer/crates/ide/src/goto_definition.rs
index 0efc6cfe9b7..35eb18e3c72 100644
--- a/src/tools/rust-analyzer/crates/ide/src/goto_definition.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/goto_definition.rs
@@ -419,8 +419,10 @@ fn nav_for_branches(
             .descend_into_macros(token.clone())
             .into_iter()
             .filter_map(|token| {
-                let match_expr =
-                    sema.token_ancestors_with_macros(token).find_map(ast::MatchExpr::cast)?;
+                let match_expr = sema
+                    .token_ancestors_with_macros(token)
+                    .take_while(|node| !ast::MacroCall::can_cast(node.kind()))
+                    .find_map(ast::MatchExpr::cast)?;
                 let file_id = sema.hir_file_for(match_expr.syntax());
                 let focus_range = match_expr.match_token()?.text_range();
                 let match_expr_in_file = InFile::new(file_id, match_expr.into());
@@ -433,8 +435,10 @@ fn nav_for_branches(
             .descend_into_macros(token.clone())
             .into_iter()
             .filter_map(|token| {
-                let match_arm =
-                    sema.token_ancestors_with_macros(token).find_map(ast::MatchArm::cast)?;
+                let match_arm = sema
+                    .token_ancestors_with_macros(token)
+                    .take_while(|node| !ast::MacroCall::can_cast(node.kind()))
+                    .find_map(ast::MatchArm::cast)?;
                 let match_expr = sema
                     .ancestors_with_macros(match_arm.syntax().clone())
                     .find_map(ast::MatchExpr::cast)?;
@@ -450,8 +454,10 @@ fn nav_for_branches(
             .descend_into_macros(token.clone())
             .into_iter()
             .filter_map(|token| {
-                let if_expr =
-                    sema.token_ancestors_with_macros(token).find_map(ast::IfExpr::cast)?;
+                let if_expr = sema
+                    .token_ancestors_with_macros(token)
+                    .take_while(|node| !ast::MacroCall::can_cast(node.kind()))
+                    .find_map(ast::IfExpr::cast)?;
                 let file_id = sema.hir_file_for(if_expr.syntax());
                 let focus_range = if_expr.if_token()?.text_range();
                 let if_expr_in_file = InFile::new(file_id, if_expr.into());
diff --git a/src/tools/rust-analyzer/crates/ide/src/highlight_related.rs b/src/tools/rust-analyzer/crates/ide/src/highlight_related.rs
index 8d93cd63283..28447005c1f 100644
--- a/src/tools/rust-analyzer/crates/ide/src/highlight_related.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/highlight_related.rs
@@ -334,8 +334,10 @@ pub(crate) fn highlight_branches(
     match token.kind() {
         T![match] => {
             for token in sema.descend_into_macros(token.clone()) {
-                let Some(match_expr) =
-                    sema.token_ancestors_with_macros(token).find_map(ast::MatchExpr::cast)
+                let Some(match_expr) = sema
+                    .token_ancestors_with_macros(token)
+                    .take_while(|node| !ast::MacroCall::can_cast(node.kind()))
+                    .find_map(ast::MatchExpr::cast)
                 else {
                     continue;
                 };
@@ -355,11 +357,14 @@ pub(crate) fn highlight_branches(
         }
         T![=>] => {
             for token in sema.descend_into_macros(token.clone()) {
-                let Some(arm) =
-                    sema.token_ancestors_with_macros(token).find_map(ast::MatchArm::cast)
+                let Some(arm) = sema
+                    .token_ancestors_with_macros(token)
+                    .take_while(|node| !ast::MacroCall::can_cast(node.kind()))
+                    .find_map(ast::MatchArm::cast)
                 else {
                     continue;
                 };
+
                 let file_id = sema.hir_file_for(arm.syntax());
                 let range = arm.fat_arrow_token().map(|token| token.text_range());
                 push_to_highlights(file_id, range, &mut highlights);
@@ -368,9 +373,11 @@ pub(crate) fn highlight_branches(
             }
         }
         T![if] => {
-            for tok in sema.descend_into_macros(token.clone()) {
-                let Some(if_expr) =
-                    sema.token_ancestors_with_macros(tok).find_map(ast::IfExpr::cast)
+            for token in sema.descend_into_macros(token.clone()) {
+                let Some(if_expr) = sema
+                    .token_ancestors_with_macros(token)
+                    .take_while(|node| !ast::MacroCall::can_cast(node.kind()))
+                    .find_map(ast::IfExpr::cast)
                 else {
                     continue;
                 };
@@ -2482,6 +2489,27 @@ fn main() {
     }
 
     #[test]
+    fn match_in_macro() {
+        // We should not highlight the outer `match` expression.
+        check(
+            r#"
+macro_rules! M {
+    (match) => { 1 };
+}
+
+fn main() {
+    match Some(1) {
+        Some(x) => x,
+        None => {
+            M!(match$0)
+        }
+    }
+}
+            "#,
+        )
+    }
+
+    #[test]
     fn labeled_block_tail_expr() {
         check(
             r#"