Skip to content

Commit 1f35e4d

Browse files
committed
Introduce invalidEscapeSequence semantic token type
1 parent 59a3e42 commit 1f35e4d

23 files changed

+52
-26
lines changed

crates/ide/src/syntax_highlighting/escape.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ pub(super) fn highlight_escape_string<T: IsString>(
1010
start: TextSize,
1111
) {
1212
string.escaped_char_ranges(&mut |piece_range, char| {
13-
if char.is_err() {
14-
return;
15-
}
16-
1713
if string.text()[piece_range.start().into()..].starts_with('\\') {
14+
let highlight = match char {
15+
Ok(_) => HlTag::EscapeSequence,
16+
Err(_) => HlTag::InvalidEscapeSequence,
17+
};
1818
stack.add(HlRange {
1919
range: piece_range + start,
20-
highlight: HlTag::EscapeSequence.into(),
20+
highlight: highlight.into(),
2121
binding_hash: None,
2222
});
2323
}

crates/ide/src/syntax_highlighting/html.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
109109
.control { font-style: italic; }
110110
.reference { font-style: italic; font-weight: bold; }
111111
112-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
112+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
113+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
113114
</style>
114115
";

crates/ide/src/syntax_highlighting/tags.rs

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub enum HlTag {
2929
Comment,
3030
EscapeSequence,
3131
FormatSpecifier,
32+
InvalidEscapeSequence,
3233
Keyword,
3334
NumericLiteral,
3435
Operator(HlOperator),
@@ -166,6 +167,7 @@ impl HlTag {
166167
HlTag::CharLiteral => "char_literal",
167168
HlTag::Comment => "comment",
168169
HlTag::EscapeSequence => "escape_sequence",
170+
HlTag::InvalidEscapeSequence => "invalid_escape_sequence",
169171
HlTag::FormatSpecifier => "format_specifier",
170172
HlTag::Keyword => "keyword",
171173
HlTag::Punctuation(punct) => match punct {

crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">fn</span> <span class="function declaration">not_static</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
4647

crates/ide/src/syntax_highlighting/test_data/highlight_attributes.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="builtin_attr attribute library">allow</span><span class="parenthesis attribute">(</span><span class="none attribute">dead_code</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>
4647
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="tool_module attribute library">rustfmt</span><span class="operator attribute">::</span><span class="tool_module attribute library">skip</span><span class="attribute_bracket attribute">]</span>

crates/ide/src/syntax_highlighting/test_data/highlight_crate_root.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module crate_root library">foo</span><span class="semicolon">;</span>
4647
<span class="keyword">use</span> <span class="module crate_root default_library library">core</span><span class="operator">::</span><span class="module default_library library">iter</span><span class="semicolon">;</span>

crates/ide/src/syntax_highlighting/test_data/highlight_default_library.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">use</span> <span class="module crate_root default_library library">core</span><span class="operator">::</span><span class="module default_library library">iter</span><span class="semicolon">;</span>
4647

crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="comment documentation">//! This is a module to test doc injection.</span>
4647
<span class="comment documentation">//! ```</span>

crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module crate_root default_library library">std</span><span class="semicolon">;</span>
4647
<span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module crate_root default_library library">alloc</span> <span class="keyword">as</span> <span class="module crate_root default_library declaration library">abc</span><span class="semicolon">;</span>

crates/ide/src/syntax_highlighting/test_data/highlight_general.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">use</span> <span class="module">inner</span><span class="operator">::</span><span class="brace">{</span><span class="self_keyword">self</span> <span class="keyword">as</span> <span class="module declaration">inner_mod</span><span class="brace">}</span><span class="semicolon">;</span>
4647
<span class="keyword">mod</span> <span class="module declaration">inner</span> <span class="brace">{</span><span class="brace">}</span>

crates/ide/src/syntax_highlighting/test_data/highlight_injection.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">fn</span> <span class="function declaration">fixture</span><span class="parenthesis">(</span><span class="value_param declaration reference">ra_fixture</span><span class="colon">:</span> <span class="punctuation">&</span><span class="builtin_type">str</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
4647

crates/ide/src/syntax_highlighting/test_data/highlight_keywords.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="self_keyword crate_root public">self</span><span class="semicolon">;</span>
4647

crates/ide/src/syntax_highlighting/test_data/highlight_lifetimes.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code>
4647
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="attribute attribute default_library library">derive</span><span class="parenthesis attribute">(</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>

crates/ide/src/syntax_highlighting/test_data/highlight_macros.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="module crate_root library">proc_macros</span><span class="operator">::</span><span class="macro library">mirror</span><span class="macro_bang">!</span> <span class="brace macro">{</span>
4647
<span class="brace macro">{</span>

crates/ide/src/syntax_highlighting/test_data/highlight_module_docs_inline.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="comment documentation">//! </span><span class="struct documentation injected intra_doc_link">[Struct]</span>
4647
<span class="comment documentation">//! This is an intra doc injection test for modules</span>

crates/ide/src/syntax_highlighting/test_data/highlight_module_docs_outline.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="comment documentation">/// </span><span class="struct documentation injected intra_doc_link">[crate::foo::Struct]</span>
4647
<span class="comment documentation">/// This is an intra doc injection test for modules</span>

crates/ide/src/syntax_highlighting/test_data/highlight_operators.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
4647
<span class="numeric_literal">1</span> <span class="arithmetic">+</span> <span class="numeric_literal">1</span> <span class="arithmetic">-</span> <span class="numeric_literal">1</span> <span class="arithmetic">*</span> <span class="numeric_literal">1</span> <span class="arithmetic">/</span> <span class="numeric_literal">1</span> <span class="arithmetic">%</span> <span class="numeric_literal">1</span> <span class="bitwise">|</span> <span class="numeric_literal">1</span> <span class="bitwise">&</span> <span class="numeric_literal">1</span> <span class="logical">!</span> <span class="numeric_literal">1</span> <span class="bitwise">^</span> <span class="numeric_literal">1</span> <span class="bitwise">&gt;&gt;</span> <span class="numeric_literal">1</span> <span class="bitwise">&lt;&lt;</span> <span class="numeric_literal">1</span><span class="semicolon">;</span>

crates/ide/src/syntax_highlighting/test_data/highlight_rainbow.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
4647
<span class="keyword">let</span> <span class="variable declaration reference" data-binding-hash="8121853618659664005" style="color: hsl(273,88%,88%);">hello</span> <span class="operator">=</span> <span class="string_literal">"hello"</span><span class="semicolon">;</span>

crates/ide/src/syntax_highlighting/test_data/highlight_strings.html

+4-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">println</span> <span class="brace">{</span>
4647
<span class="parenthesis">(</span><span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>arg<span class="colon">:</span>tt<span class="parenthesis">)</span><span class="punctuation">*</span><span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">&gt;</span> <span class="parenthesis">(</span><span class="brace">{</span>
@@ -161,8 +162,8 @@
161162
<span class="macro">println</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"Hello</span><span class="escape_sequence">\n</span><span class="string_literal macro">World"</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
162163
<span class="macro">println</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"</span><span class="escape_sequence">\u{48}</span><span class="escape_sequence">\x65</span><span class="escape_sequence">\x6C</span><span class="escape_sequence">\x6C</span><span class="escape_sequence">\x6F</span><span class="string_literal macro"> World"</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
163164

164-
<span class="keyword">let</span> <span class="punctuation">_</span> <span class="operator">=</span> <span class="string_literal">"</span><span class="escape_sequence">\x28</span><span class="escape_sequence">\x28</span><span class="escape_sequence">\x00</span><span class="escape_sequence">\x63</span><span class="string_literal">\xFF</span><span class="escape_sequence">\u{FF}</span><span class="escape_sequence">\n</span><span class="string_literal">"</span><span class="semicolon">;</span> <span class="comment">// invalid non-UTF8 escape sequences</span>
165-
<span class="keyword">let</span> <span class="punctuation">_</span> <span class="operator">=</span> <span class="string_literal">b"</span><span class="escape_sequence">\x28</span><span class="escape_sequence">\x28</span><span class="escape_sequence">\x00</span><span class="escape_sequence">\x63</span><span class="escape_sequence">\xFF</span><span class="string_literal">\u{FF}</span><span class="escape_sequence">\n</span><span class="string_literal">"</span><span class="semicolon">;</span> <span class="comment">// valid bytes, invalid unicodes</span>
165+
<span class="keyword">let</span> <span class="punctuation">_</span> <span class="operator">=</span> <span class="string_literal">"</span><span class="escape_sequence">\x28</span><span class="escape_sequence">\x28</span><span class="escape_sequence">\x00</span><span class="escape_sequence">\x63</span><span class="invalid_escape_sequence">\xFF</span><span class="escape_sequence">\u{FF}</span><span class="escape_sequence">\n</span><span class="string_literal">"</span><span class="semicolon">;</span> <span class="comment">// invalid non-UTF8 escape sequences</span>
166+
<span class="keyword">let</span> <span class="punctuation">_</span> <span class="operator">=</span> <span class="string_literal">b"</span><span class="escape_sequence">\x28</span><span class="escape_sequence">\x28</span><span class="escape_sequence">\x00</span><span class="escape_sequence">\x63</span><span class="escape_sequence">\xFF</span><span class="invalid_escape_sequence">\u{FF}</span><span class="escape_sequence">\n</span><span class="string_literal">"</span><span class="semicolon">;</span> <span class="comment">// valid bytes, invalid unicodes</span>
166167
<span class="keyword">let</span> <span class="punctuation">_</span> <span class="operator">=</span> <span class="string_literal">c"</span><span class="escape_sequence">\u{FF}</span><span class="escape_sequence">\xFF</span><span class="string_literal">"</span><span class="semicolon">;</span> <span class="comment">// valid bytes, valid unicodes</span>
167168
<span class="keyword">let</span> <span class="variable declaration reference">backslash</span> <span class="operator">=</span> <span class="string_literal">r"\\"</span><span class="semicolon">;</span>
168169

crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
.control { font-style: italic; }
4141
.reference { font-style: italic; font-weight: bold; }
4242

43-
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
43+
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
44+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4445
</style>
4546
<pre><code><span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">id</span> <span class="brace">{</span>
4647
<span class="parenthesis">(</span><span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>tt<span class="colon">:</span>tt<span class="parenthesis">)</span><span class="punctuation">*</span><span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">&gt;</span> <span class="brace">{</span>

crates/rust-analyzer/src/semantic_tokens.rs

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ define_semantic_token_types![
7878
(DERIVE_HELPER, "deriveHelper") => DECORATOR,
7979
(DOT, "dot"),
8080
(ESCAPE_SEQUENCE, "escapeSequence") => STRING,
81+
(INVALID_ESCAPE_SEQUENCE, "invalidEscapeSequence") => STRING,
8182
(FORMAT_SPECIFIER, "formatSpecifier") => STRING,
8283
(GENERIC, "generic") => TYPE_PARAMETER,
8384
(LABEL, "label"),

crates/rust-analyzer/src/to_proto.rs

+1
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ fn semantic_token_type_and_modifiers(
640640
HlTag::CharLiteral => semantic_tokens::CHAR,
641641
HlTag::Comment => semantic_tokens::COMMENT,
642642
HlTag::EscapeSequence => semantic_tokens::ESCAPE_SEQUENCE,
643+
HlTag::InvalidEscapeSequence => semantic_tokens::INVALID_ESCAPE_SEQUENCE,
643644
HlTag::FormatSpecifier => semantic_tokens::FORMAT_SPECIFIER,
644645
HlTag::Keyword => semantic_tokens::KEYWORD,
645646
HlTag::None => semantic_tokens::GENERIC,

editors/code/package.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -1801,12 +1801,16 @@
18011801
},
18021802
{
18031803
"id": "escapeSequence",
1804-
"description": "Style for char escapes in strings"
1804+
"description": "Style for char or byte escapes in strings"
18051805
},
18061806
{
18071807
"id": "formatSpecifier",
18081808
"description": "Style for {} placeholders in format strings"
18091809
},
1810+
{
1811+
"id": "invalidEscapeSequence",
1812+
"description": "Style for invalid char or byte escapes in strings"
1813+
},
18101814
{
18111815
"id": "label",
18121816
"description": "Style for labels"

0 commit comments

Comments
 (0)