aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/proc_macro_srv/src/rustc_server.rs64
1 files changed, 34 insertions, 30 deletions
diff --git a/crates/proc_macro_srv/src/rustc_server.rs b/crates/proc_macro_srv/src/rustc_server.rs
index 2798dbf0d..ceefd187d 100644
--- a/crates/proc_macro_srv/src/rustc_server.rs
+++ b/crates/proc_macro_srv/src/rustc_server.rs
@@ -199,39 +199,43 @@ pub mod token_stream {
199 199
200 impl ToString for TokenStream { 200 impl ToString for TokenStream {
201 fn to_string(&self) -> String { 201 fn to_string(&self) -> String {
202 tokentrees_to_text(&self.token_trees[..]) 202 return tokentrees_to_text(&self.token_trees[..]);
203 } 203
204 } 204 fn tokentrees_to_text(tkns: &[tt::TokenTree]) -> String {
205 tkns.iter()
206 .fold((String::new(), true), |(last, last_to_joint), tkn| {
207 let s = [last, tokentree_to_text(tkn)].join(if last_to_joint {
208 ""
209 } else {
210 " "
211 });
212 let mut is_joint = false;
213 if let tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) = tkn {
214 if punct.spacing == tt::Spacing::Joint {
215 is_joint = true;
216 }
217 }
218 (s, is_joint)
219 })
220 .0
221 }
205 222
206 fn tokentrees_to_text(tkns: &[tt::TokenTree]) -> String { 223 fn tokentree_to_text(tkn: &tt::TokenTree) -> String {
207 tkns.iter() 224 match tkn {
208 .fold((String::new(), true), |(last, last_to_joint), tkn| { 225 tt::TokenTree::Leaf(tt::Leaf::Ident(ident)) => ident.text.clone().into(),
209 let s = [last, tokentree_to_text(tkn)].join(if last_to_joint { "" } else { " " }); 226 tt::TokenTree::Leaf(tt::Leaf::Literal(literal)) => literal.text.clone().into(),
210 let mut is_joint = false; 227 tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) => format!("{}", punct.char),
211 if let tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) = tkn { 228 tt::TokenTree::Subtree(subtree) => {
212 if punct.spacing == tt::Spacing::Joint { 229 let content = tokentrees_to_text(&subtree.token_trees);
213 is_joint = true; 230 let (open, close) = match subtree.delimiter.map(|it| it.kind) {
231 None => ("", ""),
232 Some(tt::DelimiterKind::Brace) => ("{", "}"),
233 Some(tt::DelimiterKind::Parenthesis) => ("(", ")"),
234 Some(tt::DelimiterKind::Bracket) => ("[", "]"),
235 };
236 format!("{}{}{}", open, content, close)
214 } 237 }
215 } 238 }
216 (s, is_joint)
217 })
218 .0
219 }
220
221 fn tokentree_to_text(tkn: &tt::TokenTree) -> String {
222 match tkn {
223 tt::TokenTree::Leaf(tt::Leaf::Ident(ident)) => ident.text.clone().into(),
224 tt::TokenTree::Leaf(tt::Leaf::Literal(literal)) => literal.text.clone().into(),
225 tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) => format!("{}", punct.char),
226 tt::TokenTree::Subtree(subtree) => {
227 let content = tokentrees_to_text(&subtree.token_trees);
228 let (open, close) = match subtree.delimiter.map(|it| it.kind) {
229 None => ("", ""),
230 Some(tt::DelimiterKind::Brace) => ("{", "}"),
231 Some(tt::DelimiterKind::Parenthesis) => ("(", ")"),
232 Some(tt::DelimiterKind::Bracket) => ("[", "]"),
233 };
234 format!("{}{}{}", open, content, close)
235 } 239 }
236 } 240 }
237 } 241 }