mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
fix: negative nums in concat!
expansion
This commit is contained in:
parent
fdfa707807
commit
109d933736
@ -454,13 +454,13 @@ fn test_concat_expand() {
|
|||||||
#[rustc_builtin_macro]
|
#[rustc_builtin_macro]
|
||||||
macro_rules! concat {}
|
macro_rules! concat {}
|
||||||
|
|
||||||
fn main() { concat!("fo", "o", 0, r#""bar""#, "\n", false, '"', '\0'); }
|
fn main() { concat!("fo", "o", 0, r#""bar""#, "\n", false, '"', -4, - 4, '\0'); }
|
||||||
"##,
|
"##,
|
||||||
expect![[r##"
|
expect![[r##"
|
||||||
#[rustc_builtin_macro]
|
#[rustc_builtin_macro]
|
||||||
macro_rules! concat {}
|
macro_rules! concat {}
|
||||||
|
|
||||||
fn main() { "foo0\"bar\"\nfalse\"\u{0}"; }
|
fn main() { "foo0\"bar\"\nfalse\"-4-4\u{0}"; }
|
||||||
"##]],
|
"##]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -452,7 +452,10 @@ fn concat_expand(
|
|||||||
Some(_) => (),
|
Some(_) => (),
|
||||||
None => span = Some(s),
|
None => span = Some(s),
|
||||||
};
|
};
|
||||||
for (i, mut t) in tt.iter().enumerate() {
|
|
||||||
|
let mut i = 0;
|
||||||
|
let mut iter = tt.iter();
|
||||||
|
while let Some(mut t) = iter.next() {
|
||||||
// FIXME: hack on top of a hack: `$e:expr` captures get surrounded in parentheses
|
// FIXME: hack on top of a hack: `$e:expr` captures get surrounded in parentheses
|
||||||
// to ensure the right parsing order, so skip the parentheses here. Ideally we'd
|
// to ensure the right parsing order, so skip the parentheses here. Ideally we'd
|
||||||
// implement rustc's model. cc https://github.com/rust-lang/rust-analyzer/pull/10623
|
// implement rustc's model. cc https://github.com/rust-lang/rust-analyzer/pull/10623
|
||||||
@ -504,10 +507,40 @@ fn concat_expand(
|
|||||||
record_span(id.span);
|
record_span(id.span);
|
||||||
}
|
}
|
||||||
TtElement::Leaf(tt::Leaf::Punct(punct)) if i % 2 == 1 && punct.char == ',' => (),
|
TtElement::Leaf(tt::Leaf::Punct(punct)) if i % 2 == 1 && punct.char == ',' => (),
|
||||||
|
// handle negative numbers
|
||||||
|
TtElement::Leaf(tt::Leaf::Punct(punct)) if i % 2 == 0 && punct.char == '-' => {
|
||||||
|
let t = match iter.next() {
|
||||||
|
Some(t) => t,
|
||||||
|
None => {
|
||||||
|
err.get_or_insert(ExpandError::other(
|
||||||
|
call_site,
|
||||||
|
"unexpected end of input after '-'",
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
match t {
|
||||||
|
TtElement::Leaf(tt::Leaf::Literal(it))
|
||||||
|
if matches!(it.kind, tt::LitKind::Integer | tt::LitKind::Float) =>
|
||||||
|
{
|
||||||
|
format_to!(text, "-{}", it.symbol.as_str());
|
||||||
|
record_span(punct.span.cover(it.span));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
err.get_or_insert(ExpandError::other(
|
||||||
|
call_site,
|
||||||
|
"expected integer or floating pointer number after '-'",
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
err.get_or_insert(ExpandError::other(call_site, "unexpected token"));
|
err.get_or_insert(ExpandError::other(call_site, "unexpected token"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
i += 1;
|
||||||
}
|
}
|
||||||
let span = span.unwrap_or_else(|| tt.top_subtree().delimiter.open);
|
let span = span.unwrap_or_else(|| tt.top_subtree().delimiter.open);
|
||||||
ExpandResult { value: quote!(span =>#text), err }
|
ExpandResult { value: quote!(span =>#text), err }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user