]> git.lizzy.rs Git - rust.git/commitdiff
Fix spacing in proc-macro tokens to_string
authorEdwin Cheng <edwin0cheng@gmail.com>
Thu, 31 Dec 2020 05:01:15 +0000 (13:01 +0800)
committerEdwin Cheng <edwin0cheng@gmail.com>
Thu, 31 Dec 2020 05:36:19 +0000 (13:36 +0800)
crates/proc_macro_srv/src/rustc_server.rs

index 503f4c1014ab25534bb71b92580de7740b5e9a0c..b54aa1f3bf1434174792930504417af45fe3e71d 100644 (file)
@@ -204,17 +204,18 @@ fn to_text(tkn: &tt::TokenTree) -> String {
                 let content = subtree
                     .token_trees
                     .iter()
-                    .map(|tkn| {
-                        let s = to_text(tkn);
+                    .fold((String::new(), true), |(last, last_to_joint), tkn| {
+                        let s = [last, to_text(tkn)].join(if last_to_joint { "" } else { " " });
+                        let mut is_joint = false;
                         if let tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) = tkn {
-                            if punct.spacing == tt::Spacing::Alone {
-                                return s + " ";
+                            if punct.spacing == tt::Spacing::Joint {
+                                is_joint = true;
                             }
                         }
-                        s
+                        (s, is_joint)
                     })
-                    .collect::<Vec<_>>()
-                    .concat();
+                    .0;
+
                 let (open, close) = match subtree.delimiter.map(|it| it.kind) {
                     None => ("", ""),
                     Some(tt::DelimiterKind::Brace) => ("{", "}"),
@@ -710,4 +711,32 @@ fn test_rustc_server_literals() {
         assert_eq!(srv.character('c').text, "'c'");
         assert_eq!(srv.byte_string(b"1234586\x88").text, "b\"1234586\\x88\"");
     }
+
+    #[test]
+    fn test_rustc_server_to_string() {
+        let s = TokenStream {
+            subtree: tt::Subtree {
+                delimiter: None,
+                token_trees: vec![
+                    tt::TokenTree::Leaf(tt::Leaf::Ident(tt::Ident {
+                        text: "struct".into(),
+                        id: tt::TokenId::unspecified(),
+                    })),
+                    tt::TokenTree::Leaf(tt::Leaf::Ident(tt::Ident {
+                        text: "T".into(),
+                        id: tt::TokenId::unspecified(),
+                    })),
+                    tt::TokenTree::Subtree(tt::Subtree {
+                        delimiter: Some(tt::Delimiter {
+                            id: tt::TokenId::unspecified(),
+                            kind: tt::DelimiterKind::Brace,
+                        }),
+                        token_trees: vec![],
+                    }),
+                ],
+            },
+        };
+
+        assert_eq!(s.to_string(), "struct T {}");
+    }
 }