Skip to content

Commit 445052f

Browse files
committed
Adapt format specifier highlighting to support escaped squences and unicode identifiers
1 parent b2829a5 commit 445052f

File tree

4 files changed

+209
-144
lines changed

4 files changed

+209
-144
lines changed

crates/ra_ide/src/snapshots/highlight_strings.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,9 @@
7474
<span class="macro">println!</span>(<span class="string_literal">"</span><span class="attribute">{</span><span class="attribute">}</span><span class="string_literal">, `</span><span class="attribute">{</span><span class="variable">name</span><span class="attribute">:</span><span class="attribute">&gt;</span><span class="numeric_literal">8</span><span class="attribute">.</span><span class="attribute">*</span><span class="attribute">}</span><span class="string_literal">` has 3 right-aligned characters"</span>, <span class="string_literal">"Hello"</span>, <span class="numeric_literal">3</span>, name=<span class="string_literal">"1234.56"</span>);
7575
<span class="macro">println!</span>(<span class="string_literal">"Hello {{}}"</span>);
7676
<span class="macro">println!</span>(<span class="string_literal">"{{ Hello"</span>);
77+
78+
<span class="macro">println!</span>(<span class="string_literal">r"Hello, </span><span class="attribute">{</span><span class="attribute">}</span><span class="string_literal">!"</span>, <span class="string_literal">"world"</span>);
79+
80+
<span class="macro">println!</span>(<span class="string_literal">"</span><span class="attribute">{</span><span class="variable">\x41</span><span class="attribute">}</span><span class="string_literal">"</span>, A = <span class="numeric_literal">92</span>);
81+
<span class="macro">println!</span>(<span class="string_literal">"</span><span class="attribute">{</span><span class="variable">ничоси</span><span class="attribute">}</span><span class="string_literal">"</span>, ничоси = <span class="numeric_literal">92</span>);
7782
}</code></pre>

crates/ra_ide/src/syntax_highlighting.rs

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -245,28 +245,29 @@ pub(crate) fn highlight(
245245
stack.push();
246246
if is_format_string {
247247
string.lex_format_specifier(|piece_range, kind| {
248-
let highlight = match kind {
249-
FormatSpecifier::Open
250-
| FormatSpecifier::Close
251-
| FormatSpecifier::Colon
252-
| FormatSpecifier::Fill
253-
| FormatSpecifier::Align
254-
| FormatSpecifier::Sign
255-
| FormatSpecifier::NumberSign
256-
| FormatSpecifier::DollarSign
257-
| FormatSpecifier::Dot
258-
| FormatSpecifier::Asterisk
259-
| FormatSpecifier::QuestionMark => HighlightTag::Attribute,
260-
FormatSpecifier::Integer | FormatSpecifier::Zero => {
261-
HighlightTag::NumericLiteral
262-
}
263-
FormatSpecifier::Identifier => HighlightTag::Local,
264-
};
265-
stack.add(HighlightedRange {
266-
range: piece_range + range.start(),
267-
highlight: highlight.into(),
268-
binding_hash: None,
269-
});
248+
if let Some(highlight) = highlight_format_specifier(kind) {
249+
stack.add(HighlightedRange {
250+
range: piece_range + range.start(),
251+
highlight: highlight.into(),
252+
binding_hash: None,
253+
});
254+
}
255+
});
256+
}
257+
stack.pop();
258+
} else if let Some(string) =
259+
element_to_highlight.as_token().cloned().and_then(ast::RawString::cast)
260+
{
261+
stack.push();
262+
if is_format_string {
263+
string.lex_format_specifier(|piece_range, kind| {
264+
if let Some(highlight) = highlight_format_specifier(kind) {
265+
stack.add(HighlightedRange {
266+
range: piece_range + range.start(),
267+
highlight: highlight.into(),
268+
binding_hash: None,
269+
});
270+
}
270271
});
271272
}
272273
stack.pop();
@@ -277,6 +278,24 @@ pub(crate) fn highlight(
277278
stack.flattened()
278279
}
279280

281+
fn highlight_format_specifier(kind: FormatSpecifier) -> Option<HighlightTag> {
282+
Some(match kind {
283+
FormatSpecifier::Open
284+
| FormatSpecifier::Close
285+
| FormatSpecifier::Colon
286+
| FormatSpecifier::Fill
287+
| FormatSpecifier::Align
288+
| FormatSpecifier::Sign
289+
| FormatSpecifier::NumberSign
290+
| FormatSpecifier::DollarSign
291+
| FormatSpecifier::Dot
292+
| FormatSpecifier::Asterisk
293+
| FormatSpecifier::QuestionMark => HighlightTag::Attribute,
294+
FormatSpecifier::Integer | FormatSpecifier::Zero => HighlightTag::NumericLiteral,
295+
FormatSpecifier::Identifier => HighlightTag::Local,
296+
})
297+
}
298+
280299
fn macro_call_range(macro_call: &ast::MacroCall) -> Option<TextRange> {
281300
let path = macro_call.path()?;
282301
let name_ref = path.segment()?.name_ref()?;

crates/ra_ide/src/syntax_highlighting/tests.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,11 @@ fn main() {
223223
println!("{}, `{name:>8.*}` has 3 right-aligned characters", "Hello", 3, name="1234.56");
224224
println!("Hello {{}}");
225225
println!("{{ Hello");
226+
227+
println!(r"Hello, {}!", "world");
228+
229+
println!("{\x41}", A = 92);
230+
println!("{ничоси}", ничоси = 92);
226231
}"#
227232
.trim(),
228233
);

0 commit comments

Comments
 (0)