]> git.lizzy.rs Git - rust.git/commitdiff
Disable string highlight injection for macros changing string literals
authorLukas Wirth <lukastw97@gmail.com>
Tue, 23 Nov 2021 21:05:52 +0000 (22:05 +0100)
committerLukas Wirth <lukastw97@gmail.com>
Tue, 23 Nov 2021 21:13:10 +0000 (22:13 +0100)
crates/ide/src/syntax_highlighting.rs
crates/ide/src/syntax_highlighting/format.rs
crates/ide/src/syntax_highlighting/inject.rs

index 72ddbc5d1698cbfd98892f4a589a01ebf6a594af..8b613fde54da29363983680185f293b58beb1a80 100644 (file)
@@ -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,
-                        });
-                    }
-                }
-            }
-        }
     }
 }
 
index 6f6671f8ca7925b31badd68fba1040d773e1a7ea..f83262fc5c5ead0ddd3aab5aedaadd2f87299a1e 100644 (file)
 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;
     }
 
index 543a7884825c4d2e536979cf82c96ea9f93b0f82..686fd5baa724ce714afbcba66b7a3bf72b1d6632 100644 (file)
@@ -10,7 +10,7 @@
 };
 use syntax::{
     ast::{self, AstNode, IsString},
-    AstToken, NodeOrToken, SyntaxNode, SyntaxToken, TextRange, TextSize,
+    AstToken, NodeOrToken, SyntaxNode, TextRange, TextSize,
 };
 
 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;
     }