| 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), |
| } |
| } |
| } |
| } |