You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.0 KiB
43 lines
1.0 KiB
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),
|
|
}
|
|
}
|
|
}
|
|
}
|