From f3b25a6fc88b049fbb7980a32435805ff31486fd Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Tue, 23 Nov 2021 22:05:52 +0100 Subject: [PATCH] Disable string highlight injection for macros changing string literals --- crates/ide/src/syntax_highlighting.rs | 49 ++++++++++---------- crates/ide/src/syntax_highlighting/format.rs | 3 +- crates/ide/src/syntax_highlighting/inject.rs | 8 ++-- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index 72ddbc5d169..8b613fde54d 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs @@ -320,20 +320,37 @@ fn traverse( element.clone() }; - if let Some(token) = element.into_token().and_then(ast::String::cast) { - if token.is_raw() { - if let Some(expanded) = element_to_highlight.as_token() { - if inject::ra_fixture(hl, sema, token, expanded.clone()).is_some() { + if macro_highlighter.highlight(element_to_highlight.clone()).is_some() { + continue; + } + + if let (Some(token), Some(token_to_highlight)) = + (element.into_token(), element_to_highlight.as_token()) + { + let string = ast::String::cast(token); + let string_to_highlight = ast::String::cast(token_to_highlight.clone()); + if let Some((string, expanded_string)) = string.zip(string_to_highlight) { + if string.is_raw() { + if inject::ra_fixture(hl, sema, &string, &expanded_string).is_some() { continue; } } + highlight_format_string(hl, &string, &expanded_string, range); + // Highlight escape sequences + if let Some(char_ranges) = string.char_ranges() { + for (piece_range, _) in char_ranges.iter().filter(|(_, char)| char.is_ok()) { + if string.text()[piece_range.start().into()..].starts_with('\\') { + hl.add(HlRange { + range: piece_range + range.start(), + highlight: HlTag::EscapeSequence.into(), + binding_hash: None, + }); + } + } + } } } - if macro_highlighter.highlight(element_to_highlight.clone()).is_some() { - continue; - } - if let Some((mut highlight, binding_hash)) = highlight::element( sema, krate, @@ -347,22 +364,6 @@ fn traverse( hl.add(HlRange { range, highlight, binding_hash }); } - - if let Some(string) = element_to_highlight.into_token().and_then(ast::String::cast) { - highlight_format_string(hl, &string, range); - // Highlight escape sequences - if let Some(char_ranges) = string.char_ranges() { - for (piece_range, _) in char_ranges.iter().filter(|(_, char)| char.is_ok()) { - if string.text()[piece_range.start().into()..].starts_with('\\') { - hl.add(HlRange { - range: piece_range + range.start(), - highlight: HlTag::EscapeSequence.into(), - binding_hash: None, - }); - } - } - } - } } } diff --git a/crates/ide/src/syntax_highlighting/format.rs b/crates/ide/src/syntax_highlighting/format.rs index 6f6671f8ca7..f83262fc5c5 100644 --- a/crates/ide/src/syntax_highlighting/format.rs +++ b/crates/ide/src/syntax_highlighting/format.rs @@ -10,9 +10,10 @@ pub(super) fn highlight_format_string( stack: &mut Highlights, string: &ast::String, + expanded_string: &ast::String, range: TextRange, ) { - if is_format_string(string).is_none() { + if is_format_string(expanded_string).is_none() { return; } diff --git a/crates/ide/src/syntax_highlighting/inject.rs b/crates/ide/src/syntax_highlighting/inject.rs index 543a7884825..686fd5baa72 100644 --- a/crates/ide/src/syntax_highlighting/inject.rs +++ b/crates/ide/src/syntax_highlighting/inject.rs @@ -10,7 +10,7 @@ }; use syntax::{ ast::{self, AstNode, IsString}, - AstToken, NodeOrToken, SyntaxNode, SyntaxToken, TextRange, TextSize, + AstToken, NodeOrToken, SyntaxNode, TextRange, TextSize, }; use crate::{ @@ -22,10 +22,10 @@ pub(super) fn ra_fixture( hl: &mut Highlights, sema: &Semantics, - literal: ast::String, - expanded: SyntaxToken, + literal: &ast::String, + expanded: &ast::String, ) -> Option<()> { - let active_parameter = ActiveParameter::at_token(sema, expanded)?; + let active_parameter = ActiveParameter::at_token(sema, expanded.syntax().clone())?; if !active_parameter.ident().map_or(false, |name| name.text().starts_with("ra_fixture")) { return None; }