mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-10 15:14:32 +00:00
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:
commit
f8c416e1b9
2 changed files with 46 additions and 4 deletions
|
@ -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));
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in a new issue