Skip to content

Commit 3dd17bc

Browse files
committed
2 parents 4ccc83a + f0c74b3 commit 3dd17bc

File tree

4 files changed

+55
-4
lines changed

4 files changed

+55
-4
lines changed

crates/ide/src/syntax_highlighting.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ use syntax::{
2121

2222
use crate::{
2323
syntax_highlighting::{
24-
escape::highlight_escape_string, format::highlight_format_string, highlights::Highlights,
25-
macro_::MacroHighlighter, tags::Highlight,
24+
escape::{highlight_escape_char, highlight_escape_string},
25+
format::highlight_format_string,
26+
highlights::Highlights,
27+
macro_::MacroHighlighter,
28+
tags::Highlight,
2629
},
2730
FileId, HlMod, HlOperator, HlPunct, HlTag,
2831
};
@@ -427,6 +430,14 @@ fn traverse(
427430
if let Some(byte_string) = ast::ByteString::cast(token) {
428431
highlight_escape_string(hl, &byte_string, range.start());
429432
}
433+
} else if ast::Char::can_cast(token.kind())
434+
&& ast::Char::can_cast(descended_token.kind())
435+
{
436+
let Some(char) = ast::Char::cast(token) else {
437+
continue;
438+
};
439+
440+
highlight_escape_char(hl, &char, range.start())
430441
}
431442
}
432443

crates/ide/src/syntax_highlighting/escape.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
//! Syntax highlighting for escape sequences
22
use crate::syntax_highlighting::highlights::Highlights;
33
use crate::{HlRange, HlTag};
4-
use syntax::ast::IsString;
5-
use syntax::TextSize;
4+
use syntax::ast::{Char, IsString};
5+
use syntax::{AstToken, TextRange, TextSize};
66

77
pub(super) fn highlight_escape_string<T: IsString>(
88
stack: &mut Highlights,
@@ -23,3 +23,23 @@ pub(super) fn highlight_escape_string<T: IsString>(
2323
}
2424
});
2525
}
26+
27+
pub(super) fn highlight_escape_char(stack: &mut Highlights, char: &Char, start: TextSize) {
28+
if char.value().is_none() {
29+
return;
30+
}
31+
32+
let text = char.text();
33+
if !text.starts_with('\'') || !text.ends_with('\'') {
34+
return;
35+
}
36+
37+
let text = &text[1..text.len() - 1];
38+
if !text.starts_with('\\') {
39+
return;
40+
}
41+
42+
let range =
43+
TextRange::new(start + TextSize::from(1), start + TextSize::from(text.len() as u32 + 1));
44+
stack.add(HlRange { range, highlight: HlTag::EscapeSequence.into(), binding_hash: None })
45+
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@
9393
<span class="brace">}</span>
9494

9595
<span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
96+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'</span><span class="escape_sequence">\n</span><span class="char_literal">'</span><span class="semicolon">;</span>
97+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'</span><span class="escape_sequence">\t</span><span class="char_literal">'</span><span class="semicolon">;</span>
98+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'\e'</span><span class="semicolon">;</span> <span class="comment">// invalid escape</span>
99+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'e'</span><span class="semicolon">;</span>
100+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">' '</span><span class="semicolon">;</span>
101+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'</span><span class="escape_sequence">\u{48}</span><span class="char_literal">'</span><span class="semicolon">;</span>
102+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'</span><span class="escape_sequence">\u{4823}</span><span class="char_literal">'</span><span class="semicolon">;</span>
103+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'</span><span class="escape_sequence">\x65</span><span class="char_literal">'</span><span class="semicolon">;</span>
104+
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'</span><span class="escape_sequence">\x00</span><span class="char_literal">'</span><span class="semicolon">;</span>
105+
96106
<span class="macro">println</span><span class="macro_bang">!</span><span class="parenthesis">(</span><span class="string_literal">"Hello </span><span class="escape_sequence">{{</span><span class="string_literal">Hello</span><span class="escape_sequence">}}</span><span class="string_literal">"</span><span class="parenthesis">)</span><span class="semicolon">;</span>
97107
<span class="comment">// from https://doc.rust-lang.org/std/fmt/index.html</span>
98108
<span class="macro">println</span><span class="macro_bang">!</span><span class="parenthesis">(</span><span class="string_literal">"Hello"</span><span class="parenthesis">)</span><span class="semicolon">;</span> <span class="comment">// =&gt; "Hello"</span>

crates/ide/src/syntax_highlighting/tests.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,16 @@ macro_rules! toho {
439439
}
440440
441441
fn main() {
442+
let a = '\n';
443+
let a = '\t';
444+
let a = '\e'; // invalid escape
445+
let a = 'e';
446+
let a = ' ';
447+
let a = '\u{48}';
448+
let a = '\u{4823}';
449+
let a = '\x65';
450+
let a = '\x00';
451+
442452
println!("Hello {{Hello}}");
443453
// from https://doc.rust-lang.org/std/fmt/index.html
444454
println!("Hello"); // => "Hello"

0 commit comments

Comments
 (0)