Auto merge of #12650 - lowr:fix/12591, r=lnicola

fix: improve whitespace insertion in pretty printer

Fixes #12591

The `=>` token in the macro_rules! should be parsed as one fat arrow, but it ["requires a lot of changes in r-a"](143cc528b1), so I left it for the larger refactoring in the future and put a FIXME note.
This commit is contained in:
bors 2022-07-01 08:32:04 +00:00
commit f8c416e1b9
2 changed files with 46 additions and 4 deletions

View file

@ -33,7 +33,10 @@ pub fn insert_ws_into(syn: SyntaxNode) -> SyntaxNode {
let token = match event {
WalkEvent::Enter(NodeOrToken::Token(token)) => token,
WalkEvent::Leave(NodeOrToken::Node(node))
if matches!(node.kind(), ATTR | MATCH_ARM | STRUCT | ENUM | UNION | FN | IMPL) =>
if matches!(
node.kind(),
ATTR | MATCH_ARM | STRUCT | ENUM | UNION | FN | IMPL | MACRO_RULES
) =>
{
if indent > 0 {
mods.push((
@ -66,9 +69,7 @@ pub fn insert_ws_into(syn: SyntaxNode) -> SyntaxNode {
mods.push(do_ws(before, tok));
}
if indent > 0 {
mods.push(do_indent(after, tok, indent));
}
mods.push(do_indent(after, tok, indent));
mods.push(do_nl(after, tok));
}
R_CURLY if is_last(|it| it != L_CURLY, true) => {
@ -100,10 +101,19 @@ pub fn insert_ws_into(syn: SyntaxNode) -> SyntaxNode {
}
mods.push(do_nl(after, tok));
}
T![=] if is_next(|it| it == T![>], false) => {
// FIXME: this branch is for `=>` in macro_rules!, which is currently parsed as
// two separate symbols.
mods.push(do_ws(before, tok));
mods.push(do_ws(after, &tok.next_token().unwrap()));
}
T![->] | T![=] | T![=>] => {
mods.push(do_ws(before, tok));
mods.push(do_ws(after, tok));
}
T![!] if is_last(|it| it == MACRO_RULES_KW, false) && is_next(is_text, false) => {
mods.push(do_ws(after, tok));
}
_ => (),
}

View file

@ -360,6 +360,38 @@ fn main() {
);
}
#[test]
fn macro_expand_inner_macro_rules() {
check(
r#"
macro_rules! foo {
($t:tt) => {{
macro_rules! bar {
() => {
$t
}
}
bar!()
}};
}
fn main() {
foo$0!(42);
}
"#,
expect![[r#"
foo
{
macro_rules! bar {
() => {
42
}
}
42
}"#]],
);
}
#[test]
fn macro_expand_inner_macro_fail_to_expand() {
check(