1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
use proc_macro::{Group, Span, TokenStream, TokenTree}; #[proc_macro] pub fn reedition(t: TokenStream) -> TokenStream { let mut t = t.into_iter(); let dummy = t.next().unwrap(); let stream = t.next().unwrap(); match stream { TokenTree::Group(g) => respan(dummy.span(), g.stream()), _ => unreachable!(), } } fn respan(span: Span, tokens: TokenStream) -> TokenStream { tokens .into_iter() .map(|token| match token { TokenTree::Group(group) => { let mut fixed = Group::new(group.delimiter(), respan(span, group.stream())); fixed.set_span(group.span().resolved_at(span)); TokenTree::Group(fixed) } mut token => { token.set_span(token.span().resolved_at(span)); token } }) .collect() }