@@ -17,6 +17,7 @@ use tokenstream::{self, TokenTree, Delimited, SequenceRepetition};
17
17
use util:: small_vector:: SmallVector ;
18
18
19
19
use std:: rc:: Rc ;
20
+ use std:: mem;
20
21
use std:: ops:: Add ;
21
22
use std:: collections:: HashMap ;
22
23
@@ -52,17 +53,9 @@ impl Iterator for Frame {
52
53
53
54
fn next ( & mut self ) -> Option < TokenTree > {
54
55
match * self {
55
- Frame :: Delimited { ref forest, ref mut idx, span } => {
56
+ Frame :: Delimited { ref forest, ref mut idx, .. } => {
56
57
* idx += 1 ;
57
- if * idx == forest. delim . len ( ) {
58
- Some ( forest. open_tt ( span) )
59
- } else if let Some ( tree) = forest. tts . get ( * idx - forest. delim . len ( ) - 1 ) {
60
- Some ( tree. clone ( ) )
61
- } else if * idx == forest. tts . len ( ) + 2 * forest. delim . len ( ) {
62
- Some ( forest. close_tt ( span) )
63
- } else {
64
- None
65
- }
58
+ forest. tts . get ( * idx - 1 ) . cloned ( )
66
59
}
67
60
Frame :: Sequence { ref forest, ref mut idx, .. } => {
68
61
* idx += 1 ;
@@ -93,6 +86,7 @@ pub fn transcribe(sp_diag: &Handler,
93
86
let mut repeat_idx = Vec :: new ( ) ;
94
87
let mut repeat_len = Vec :: new ( ) ;
95
88
let mut result = Vec :: new ( ) ;
89
+ let mut result_stack = Vec :: new ( ) ;
96
90
97
91
loop {
98
92
let tree = if let Some ( tree) = stack. last_mut ( ) . unwrap ( ) . next ( ) {
@@ -111,12 +105,23 @@ pub fn transcribe(sp_diag: &Handler,
111
105
}
112
106
}
113
107
114
- if let Frame :: Sequence { .. } = stack. pop ( ) . unwrap ( ) {
115
- repeat_idx. pop ( ) ;
116
- repeat_len. pop ( ) ;
117
- }
118
- if stack. is_empty ( ) {
119
- return result;
108
+ match stack. pop ( ) . unwrap ( ) {
109
+ Frame :: Sequence { .. } => {
110
+ repeat_idx. pop ( ) ;
111
+ repeat_len. pop ( ) ;
112
+ }
113
+ Frame :: Delimited { forest, span, .. } => {
114
+ if result_stack. is_empty ( ) {
115
+ return result;
116
+ }
117
+ let tree = TokenTree :: Delimited ( span, Rc :: new ( Delimited {
118
+ delim : forest. delim ,
119
+ tts : result,
120
+ } ) ) ;
121
+ result = result_stack. pop ( ) . unwrap ( ) ;
122
+ result. push ( tree) ;
123
+ }
124
+ _ => { }
120
125
}
121
126
continue
122
127
} ;
@@ -184,6 +189,7 @@ pub fn transcribe(sp_diag: &Handler,
184
189
}
185
190
TokenTree :: Delimited ( span, delimited) => {
186
191
stack. push ( Frame :: Delimited { forest : delimited, idx : 0 , span : span } ) ;
192
+ result_stack. push ( mem:: replace ( & mut result, Vec :: new ( ) ) ) ;
187
193
}
188
194
TokenTree :: Token ( span, MatchNt ( name, kind) ) => {
189
195
stack. push ( Frame :: MatchNt { name : name, kind : kind, idx : 0 , span : span } ) ;
0 commit comments