Fixed whitespace bug

This commit is contained in:
Edwin Cheng 2020-03-04 23:38:58 +08:00
parent 028595548b
commit 6794d50a9b
2 changed files with 35 additions and 3 deletions

View file

@ -388,11 +388,12 @@ impl<'a> TreeSink for TtTreeSink<'a> {
return; return;
} }
let mut last = self.cursor;
for _ in 0..n_tokens { for _ in 0..n_tokens {
if self.cursor.eof() { if self.cursor.eof() {
break; break;
} }
last = self.cursor;
let text: SmolStr = match self.cursor.token_tree() { let text: SmolStr = match self.cursor.token_tree() {
Some(tt::TokenTree::Leaf(leaf)) => { Some(tt::TokenTree::Leaf(leaf)) => {
// Mark the range if needed // Mark the range if needed
@ -441,11 +442,11 @@ impl<'a> TreeSink for TtTreeSink<'a> {
self.inner.token(kind, text); self.inner.token(kind, text);
// Add whitespace between adjoint puncts // Add whitespace between adjoint puncts
let next = self.cursor.bump(); let next = last.bump();
if let ( if let (
Some(tt::TokenTree::Leaf(tt::Leaf::Punct(curr))), Some(tt::TokenTree::Leaf(tt::Leaf::Punct(curr))),
Some(tt::TokenTree::Leaf(tt::Leaf::Punct(_))), Some(tt::TokenTree::Leaf(tt::Leaf::Punct(_))),
) = (self.cursor.token_tree(), next.token_tree()) ) = (last.token_tree(), next.token_tree())
{ {
if curr.spacing == tt::Spacing::Alone { if curr.spacing == tt::Spacing::Alone {
self.inner.token(WHITESPACE, " ".into()); self.inner.token(WHITESPACE, " ".into());

View file

@ -838,6 +838,37 @@ fn test_tt_composite() {
.assert_expand_items(r#"foo! { => }"#, r#"0"#); .assert_expand_items(r#"foo! { => }"#, r#"0"#);
} }
#[test]
fn test_tt_composite2() {
let node = parse_macro(
r#"
macro_rules! foo {
($($tt:tt)*) => { abs!(=> $($tt)*) }
}
"#,
)
.expand_items(r#"foo!{#}"#);
let res = format!("{:#?}", &node);
assert_eq_text!(
res.trim(),
r###"MACRO_ITEMS@[0; 10)
MACRO_CALL@[0; 10)
PATH@[0; 3)
PATH_SEGMENT@[0; 3)
NAME_REF@[0; 3)
IDENT@[0; 3) "abs"
EXCL@[3; 4) "!"
TOKEN_TREE@[4; 10)
L_PAREN@[4; 5) "("
EQ@[5; 6) "="
R_ANGLE@[6; 7) ">"
WHITESPACE@[7; 8) " "
POUND@[8; 9) "#"
R_PAREN@[9; 10) ")""###
);
}
#[test] #[test]
fn test_lifetime() { fn test_lifetime() {
parse_macro( parse_macro(