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.rs | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/crates/ide/src/highlight_related.rs b/crates/ide/src/highlight_related.rs index 8d93cd6328..28447005c1 100644 --- a/crates/ide/src/highlight_related.rs +++ b/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#" |