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 30 31 32 33 34 35 36 37 38 39 40 41 42
use proc_macro::{token_stream, Delimiter, TokenStream, TokenTree}; pub type Iter<'a> = &'a mut IterImpl; pub struct IterImpl { stack: Vec<token_stream::IntoIter>, peeked: Option<TokenTree>, } pub fn new(tokens: TokenStream) -> IterImpl { IterImpl { stack: vec![tokens.into_iter()], peeked: None, } } impl IterImpl { pub fn peek(&mut self) -> Option<&TokenTree> { self.peeked = self.next(); self.peeked.as_ref() } } impl Iterator for IterImpl { type Item = TokenTree; fn next(&mut self) -> Option<Self::Item> { if let Some(tt) = self.peeked.take() { return Some(tt); } loop { let top = self.stack.last_mut()?; match top.next() { None => drop(self.stack.pop()), Some(TokenTree::Group(ref group)) if group.delimiter() == Delimiter::None => { self.stack.push(group.stream().into_iter()); } Some(tt) => return Some(tt), } } } }