Skip to content

Commit b366b98

Browse files
bors[bot]ltentrup
andauthored
Merge #4787
4787: Fix bug in lexer for format specifier r=matklad a=ltentrup The `type` and `width` were not correctly distinguished. Fixes #4696. Co-authored-by: Leander Tentrup <leander.tentrup@gmail.com>
2 parents d696776 + 3aaaf92 commit b366b98

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

crates/ra_ide/src/snapshots/highlight_strings.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">^</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="string_literal">"x"</span>);
6464
<span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">&gt;</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="string_literal">"x"</span>);
6565
<span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">+</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">5</span>);
66-
<span class="macro">println!</span>(<span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">#</span><span class="variable">x</span><span class="string_literal">}!"</span>, <span class="numeric_literal">27</span>);
66+
<span class="macro">println!</span>(<span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">#</span><span class="variable">x</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">27</span>);
6767
<span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="numeric_literal">0</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">5</span>);
6868
<span class="macro">println!</span>(<span class="string_literal">"Hello </span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="numeric_literal">0</span><span class="numeric_literal">5</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, -<span class="numeric_literal">5</span>);
6969
<span class="macro">println!</span>(<span class="string_literal">"</span><span class="format_specifier">{</span><span class="format_specifier">:</span><span class="format_specifier">#</span><span class="numeric_literal">0</span><span class="numeric_literal">10</span><span class="variable">x</span><span class="format_specifier">}</span><span class="string_literal">!"</span>, <span class="numeric_literal">27</span>);

crates/ra_syntax/src/ast/tokens.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -335,16 +335,26 @@ pub trait HasFormatSpecifier: AstToken {
335335
}
336336
c if c == '_' || c.is_alphabetic() => {
337337
read_identifier(&mut chars, &mut callback);
338-
if chars.peek().and_then(|next| next.1.as_ref().ok()).copied()
339-
!= Some('$')
340-
{
341-
continue;
342-
}
343-
skip_char_and_emit(
344-
&mut chars,
345-
FormatSpecifier::DollarSign,
346-
&mut callback,
347-
);
338+
// can be either width (indicated by dollar sign, or type in which case
339+
// the next sign has to be `}`)
340+
let next =
341+
chars.peek().and_then(|next| next.1.as_ref().ok()).copied();
342+
match next {
343+
Some('$') => skip_char_and_emit(
344+
&mut chars,
345+
FormatSpecifier::DollarSign,
346+
&mut callback,
347+
),
348+
Some('}') => {
349+
skip_char_and_emit(
350+
&mut chars,
351+
FormatSpecifier::Close,
352+
&mut callback,
353+
);
354+
continue;
355+
}
356+
_ => continue,
357+
};
348358
}
349359
_ => {}
350360
}
@@ -416,12 +426,11 @@ pub trait HasFormatSpecifier: AstToken {
416426
}
417427
}
418428

419-
let mut cloned = chars.clone().take(2);
420-
let first = cloned.next().and_then(|next| next.1.as_ref().ok()).copied();
421-
if first != Some('}') {
429+
if let Some((_, Ok('}'))) = chars.peek() {
430+
skip_char_and_emit(&mut chars, FormatSpecifier::Close, &mut callback);
431+
} else {
422432
continue;
423433
}
424-
skip_char_and_emit(&mut chars, FormatSpecifier::Close, &mut callback);
425434
}
426435
_ => {
427436
while let Some((_, Ok(next_char))) = chars.peek() {

0 commit comments

Comments
 (0)