Deduplicate token stream respanner

This commit is contained in:
David Tolnay
2021-01-24 23:01:50 -08:00
parent 033114a4ae
commit 1f423580a5
3 changed files with 20 additions and 37 deletions
+12 -18
View File
@@ -1,22 +1,16 @@
use proc_macro2::{Span, TokenStream};
use quote::ToTokens;
use syn::parse::Parse;
use proc_macro2::{Group, Span, TokenStream, TokenTree};
pub(crate) fn respan<T>(node: &T, span: Span) -> T
where
T: ToTokens + Parse,
{
let tokens = node.to_token_stream();
let respanned = respan_tokens(tokens, span);
syn::parse2(respanned).unwrap()
}
fn respan_tokens(tokens: TokenStream, span: Span) -> TokenStream {
tokens
pub(crate) fn respan(stream: TokenStream, span: Span) -> TokenStream {
stream
.into_iter()
.map(|mut token| {
token.set_span(span);
token
})
.map(|token| respan_token(token, span))
.collect()
}
fn respan_token(mut token: TokenTree, span: Span) -> TokenTree {
if let TokenTree::Group(g) = &mut token {
*g = Group::new(g.delimiter(), respan(g.stream(), span));
}
token.set_span(span);
token
}