This repository was archived by the owner on Dec 27, 2022. It is now read-only.
File tree 1 file changed +20
-6
lines changed
1 file changed +20
-6
lines changed Original file line number Diff line number Diff line change 1
- use proc_macro:: { token_stream, TokenStream , TokenTree } ;
2
- use std:: iter:: Peekable ;
1
+ use proc_macro:: { token_stream, Delimiter , TokenStream , TokenTree } ;
3
2
4
3
pub type Iter < ' a > = & ' a mut IterImpl ;
5
4
6
5
pub struct IterImpl {
7
- tokens : Peekable < token_stream:: IntoIter > ,
6
+ stack : Vec < token_stream:: IntoIter > ,
7
+ peeked : Option < TokenTree > ,
8
8
}
9
9
10
10
pub fn new ( tokens : TokenStream ) -> IterImpl {
11
11
IterImpl {
12
- tokens : tokens. into_iter ( ) . peekable ( ) ,
12
+ stack : vec ! [ tokens. into_iter( ) ] ,
13
+ peeked : None ,
13
14
}
14
15
}
15
16
16
17
impl IterImpl {
17
18
pub fn peek ( & mut self ) -> Option < & TokenTree > {
18
- self . tokens . peek ( )
19
+ self . peeked = self . next ( ) ;
20
+ self . peeked . as_ref ( )
19
21
}
20
22
}
21
23
22
24
impl Iterator for IterImpl {
23
25
type Item = TokenTree ;
24
26
25
27
fn next ( & mut self ) -> Option < Self :: Item > {
26
- self . tokens . next ( )
28
+ if let Some ( tt) = self . peeked . take ( ) {
29
+ return Some ( tt) ;
30
+ }
31
+ loop {
32
+ let top = self . stack . last_mut ( ) ?;
33
+ match top. next ( ) {
34
+ None => drop ( self . stack . pop ( ) ) ,
35
+ Some ( TokenTree :: Group ( ref group) ) if group. delimiter ( ) == Delimiter :: None => {
36
+ self . stack . push ( group. stream ( ) . into_iter ( ) ) ;
37
+ }
38
+ Some ( tt) => return Some ( tt) ,
39
+ }
40
+ }
27
41
}
28
42
}
You can’t perform that action at this time.
0 commit comments