about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/ide/src/syntax_highlighting.rs49
-rw-r--r--crates/ide/src/syntax_highlighting/format.rs3
-rw-r--r--crates/ide/src/syntax_highlighting/inject.rs8
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 @@ use crate::{syntax_highlighting::highlights::Highlights, HlRange, HlTag};
 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 ide_db::{
 };
 use syntax::{
     ast::{self, AstNode, IsString},
-    AstToken, NodeOrToken, SyntaxNode, SyntaxToken, TextRange, TextSize,
+    AstToken, NodeOrToken, SyntaxNode, TextRange, TextSize,
 };
 
 use crate::{
@@ -22,10 +22,10 @@ use crate::{
 pub(super) fn ra_fixture(
     hl: &mut Highlights,
     sema: &Semantics<RootDatabase>,
-    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;
     }