Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/syntax_highlighting.rs')
| -rw-r--r-- | crates/ide/src/syntax_highlighting.rs | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index 0119ba5cb7..e5d4ed8b92 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs @@ -7,6 +7,7 @@ mod highlight; mod format; mod macro_; mod inject; +mod escape; mod html; #[cfg(test)] @@ -16,16 +17,13 @@ use hir::{InFile, Name, Semantics}; use ide_db::RootDatabase; use rustc_hash::FxHashMap; use syntax::{ - ast::{self, IsString}, - AstNode, AstToken, NodeOrToken, - SyntaxKind::*, - SyntaxNode, TextRange, WalkEvent, T, + ast, AstNode, AstToken, NodeOrToken, SyntaxKind::*, SyntaxNode, TextRange, WalkEvent, T, }; use crate::{ syntax_highlighting::{ - format::highlight_format_string, highlights::Highlights, macro_::MacroHighlighter, - tags::Highlight, + escape::highlight_escape_string, format::highlight_format_string, highlights::Highlights, + macro_::MacroHighlighter, tags::Highlight, }, FileId, HlMod, HlTag, }; @@ -371,29 +369,25 @@ fn traverse( // string highlight injections, note this does not use the descended element as proc-macros // can rewrite string literals which invalidates our indices if let (Some(token), Some(descended_token)) = (token, descended_element.as_token()) { - let string = ast::String::cast(token); - let string_to_highlight = ast::String::cast(descended_token.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; + if ast::String::can_cast(token.kind()) && ast::String::can_cast(descended_token.kind()) + { + let string = ast::String::cast(token); + let string_to_highlight = ast::String::cast(descended_token.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_string(hl, &string, range.start()); + } + } else if ast::ByteString::can_cast(token.kind()) + && ast::ByteString::can_cast(descended_token.kind()) + { + if let Some(byte_string) = ast::ByteString::cast(token) { + highlight_escape_string(hl, &byte_string, range.start()); } - highlight_format_string(hl, &string, &expanded_string, range); - // Highlight escape sequences - string.escaped_char_ranges(&mut |piece_range, char| { - if char.is_err() { - return; - } - - if string.text()[piece_range.start().into()..].starts_with('\\') { - hl.add(HlRange { - range: piece_range + range.start(), - highlight: HlTag::EscapeSequence.into(), - binding_hash: None, - }); - } - }); } } |