extern crate proc_macro;
use ::proc_macro::{*,
TokenTree as TT,
};
fn recursive_map(input: TokenStream)
-> TokenStream
{
let mut tokens = input.into_iter().peekable();
let mut ret = TokenStream::new();
while let Some(mut tt) = tokens.next() {
ret.extend(::core::iter::once(match tt {
| TT::Punct(ref p)
if p.as_char() == '@'
=> match tokens.peek() {
| Some(&TT::Group(ref g))
if g.delimiter() == Delimiter::None
=> {
ret.extend(recursive_map(g.stream()));
drop(tokens.next());
continue;
},
| Some(TT::Punct(ref p))
if p.as_char() == '@'
=> {
tokens.next().unwrap()
}
| _ => continue,
},
| TT::Group(ref mut g) => {
let (delimiter, its_span, inner_tokens) =
(g.delimiter(), g.span(), g.stream())
;
*g = Group::new(delimiter, recursive_map(inner_tokens));
g.set_span(its_span);
tt
},
| _ => tt,
}));
}
ret
}
#[proc_macro] pub
fn defile(input: TokenStream)
-> TokenStream
{
recursive_map(input)
}