Fix spacing in proc-macro tokens to_string

This commit is contained in:
Edwin Cheng 2020-12-31 13:01:15 +08:00
parent bed7be9ed9
commit 1bd1830f50

View file

@ -204,17 +204,18 @@ pub mod token_stream {
let content = subtree let content = subtree
.token_trees .token_trees
.iter() .iter()
.map(|tkn| { .fold((String::new(), true), |(last, last_to_joint), tkn| {
let s = to_text(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 let tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) = tkn {
if punct.spacing == tt::Spacing::Alone { if punct.spacing == tt::Spacing::Joint {
return s + " "; is_joint = true;
} }
} }
s (s, is_joint)
}) })
.collect::<Vec<_>>() .0;
.concat();
let (open, close) = match subtree.delimiter.map(|it| it.kind) { let (open, close) = match subtree.delimiter.map(|it| it.kind) {
None => ("", ""), None => ("", ""),
Some(tt::DelimiterKind::Brace) => ("{", "}"), Some(tt::DelimiterKind::Brace) => ("{", "}"),
@ -710,4 +711,32 @@ mod tests {
assert_eq!(srv.character('c').text, "'c'"); assert_eq!(srv.character('c').text, "'c'");
assert_eq!(srv.byte_string(b"1234586\x88").text, "b\"1234586\\x88\""); 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 {}");
}
} }