about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRyo Yoshida <low.ryoshida@gmail.com>2022-06-28 20:40:22 +0900
committerRyo Yoshida <low.ryoshida@gmail.com>2022-06-28 20:44:55 +0900
commit36d2b43dfd6b7eb6d5549d04405c8d3323da29b5 (patch)
tree7aaec78b55461ca35eac48dacfd5233537b2ee70
parent9eaf96c9ead87703d96558e9b9923a0baea27981 (diff)
downloadrust-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.rs18
-rw-r--r--crates/ide/src/expand_macro.rs32
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#"