diff options
| author | Ryo Yoshida <low.ryoshida@gmail.com> | 2022-06-28 20:40:22 +0900 |
|---|---|---|
| committer | Ryo Yoshida <low.ryoshida@gmail.com> | 2022-06-28 20:44:55 +0900 |
| commit | 36d2b43dfd6b7eb6d5549d04405c8d3323da29b5 (patch) | |
| tree | 7aaec78b55461ca35eac48dacfd5233537b2ee70 | |
| parent | 9eaf96c9ead87703d96558e9b9923a0baea27981 (diff) | |
| download | rust-36d2b43dfd6b7eb6d5549d04405c8d3323da29b5.tar.gz rust-36d2b43dfd6b7eb6d5549d04405c8d3323da29b5.zip | |
fix: improve whitespace insertion in pretty printer
| -rw-r--r-- | crates/ide-db/src/syntax_helpers/insert_whitespace_into_node.rs | 18 | ||||
| -rw-r--r-- | crates/ide/src/expand_macro.rs | 32 |
2 files changed, 46 insertions, 4 deletions
diff --git a/crates/ide-db/src/syntax_helpers/insert_whitespace_into_node.rs b/crates/ide-db/src/syntax_helpers/insert_whitespace_into_node.rs index a06f18543fc..f54ae6c9202 100644 --- a/crates/ide-db/src/syntax_helpers/insert_whitespace_into_node.rs +++ b/crates/ide-db/src/syntax_helpers/insert_whitespace_into_node.rs @@ -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)); + } _ => (), } diff --git a/crates/ide/src/expand_macro.rs b/crates/ide/src/expand_macro.rs index d36670e983f..fd0a29f64f6 100644 --- a/crates/ide/src/expand_macro.rs +++ b/crates/ide/src/expand_macro.rs @@ -361,6 +361,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( r#" |
