mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 05:15:04 +00:00
Fix bug in lexer for format specifier where the type
and width
were not correctly distinguished
This commit is contained in:
parent
dc340f12a3
commit
3aaaf924cb
2 changed files with 24 additions and 15 deletions
|
@ -63,7 +63,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
|
||||||
<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>);
|
<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>);
|
||||||
<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>);
|
<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>);
|
||||||
<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>);
|
<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>);
|
||||||
<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>);
|
<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>);
|
||||||
<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>);
|
<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>);
|
||||||
<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>);
|
<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>);
|
||||||
<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>);
|
<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>);
|
||||||
|
|
|
@ -335,16 +335,26 @@ pub trait HasFormatSpecifier: AstToken {
|
||||||
}
|
}
|
||||||
c if c == '_' || c.is_alphabetic() => {
|
c if c == '_' || c.is_alphabetic() => {
|
||||||
read_identifier(&mut chars, &mut callback);
|
read_identifier(&mut chars, &mut callback);
|
||||||
if chars.peek().and_then(|next| next.1.as_ref().ok()).copied()
|
// can be either width (indicated by dollar sign, or type in which case
|
||||||
!= Some('$')
|
// the next sign has to be `}`)
|
||||||
{
|
let next =
|
||||||
continue;
|
chars.peek().and_then(|next| next.1.as_ref().ok()).copied();
|
||||||
}
|
match next {
|
||||||
skip_char_and_emit(
|
Some('$') => skip_char_and_emit(
|
||||||
&mut chars,
|
&mut chars,
|
||||||
FormatSpecifier::DollarSign,
|
FormatSpecifier::DollarSign,
|
||||||
&mut callback,
|
&mut callback,
|
||||||
);
|
),
|
||||||
|
Some('}') => {
|
||||||
|
skip_char_and_emit(
|
||||||
|
&mut chars,
|
||||||
|
FormatSpecifier::Close,
|
||||||
|
&mut callback,
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
_ => continue,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
@ -416,12 +426,11 @@ pub trait HasFormatSpecifier: AstToken {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut cloned = chars.clone().take(2);
|
if let Some((_, Ok('}'))) = chars.peek() {
|
||||||
let first = cloned.next().and_then(|next| next.1.as_ref().ok()).copied();
|
skip_char_and_emit(&mut chars, FormatSpecifier::Close, &mut callback);
|
||||||
if first != Some('}') {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
skip_char_and_emit(&mut chars, FormatSpecifier::Close, &mut callback);
|
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
while let Some((_, Ok(next_char))) = chars.peek() {
|
while let Some((_, Ok(next_char))) = chars.peek() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue