@@ -145,6 +145,7 @@ struct TokenCursorFrame {
145
145
tree_cursor : tokenstream:: Cursor ,
146
146
close_delim : bool ,
147
147
last_token : LastToken ,
148
+ original_tree : Option < TokenTree > ,
148
149
}
149
150
150
151
/// This is used in `TokenCursorFrame` above to track tokens that are consumed
@@ -171,14 +172,20 @@ enum LastToken {
171
172
}
172
173
173
174
impl TokenCursorFrame {
174
- fn new ( span : DelimSpan , delim : DelimToken , tts : & TokenStream ) -> Self {
175
+ fn new (
176
+ span : DelimSpan ,
177
+ delim : DelimToken ,
178
+ tts : & TokenStream ,
179
+ original_tree : Option < TokenTree > ,
180
+ ) -> Self {
175
181
TokenCursorFrame {
176
182
delim,
177
183
span,
178
184
open_delim : delim == token:: NoDelim ,
179
185
tree_cursor : tts. clone ( ) . into_trees ( ) ,
180
186
close_delim : delim == token:: NoDelim ,
181
187
last_token : LastToken :: Was ( None ) ,
188
+ original_tree,
182
189
}
183
190
}
184
191
}
@@ -206,10 +213,10 @@ impl TokenCursor {
206
213
LastToken :: Was ( ref mut t) => * t = Some ( tree. clone ( ) . into ( ) ) ,
207
214
}
208
215
209
- match tree {
216
+ match tree. clone ( ) {
210
217
TokenTree :: Token ( token) => return token,
211
218
TokenTree :: Delimited ( sp, delim, tts) => {
212
- let frame = TokenCursorFrame :: new ( sp, delim, & tts) ;
219
+ let frame = TokenCursorFrame :: new ( sp, delim, & tts, Some ( tree ) ) ;
213
220
self . stack . push ( mem:: replace ( & mut self . frame , frame) ) ;
214
221
}
215
222
}
@@ -270,6 +277,7 @@ impl TokenCursor {
270
277
. cloned ( )
271
278
. collect :: < TokenStream > ( )
272
279
} ,
280
+ None ,
273
281
) ,
274
282
) ) ;
275
283
@@ -373,7 +381,7 @@ impl<'a> Parser<'a> {
373
381
root_module_name : None ,
374
382
expected_tokens : Vec :: new ( ) ,
375
383
token_cursor : TokenCursor {
376
- frame : TokenCursorFrame :: new ( DelimSpan :: dummy ( ) , token:: NoDelim , & tokens) ,
384
+ frame : TokenCursorFrame :: new ( DelimSpan :: dummy ( ) , token:: NoDelim , & tokens, None ) ,
377
385
stack : Vec :: new ( ) ,
378
386
} ,
379
387
desugar_doc_comments,
@@ -1147,6 +1155,13 @@ impl<'a> Parser<'a> {
1147
1155
& mut self ,
1148
1156
f : impl FnOnce ( & mut Self ) -> PResult < ' a , R > ,
1149
1157
) -> PResult < ' a , ( R , TokenStream ) > {
1158
+ if matches ! ( self . token. kind, TokenKind :: OpenDelim ( _) ) {
1159
+ let tokens = vec ! [
1160
+ self . token_cursor. frame. original_tree. clone( ) . expect( "Missing token tree!" ) . into( ) ,
1161
+ ] ;
1162
+ let ret = f ( self ) ;
1163
+ return Ok ( ( ret?, TokenStream :: new ( tokens) ) ) ;
1164
+ }
1150
1165
// Record all tokens we parse when parsing this item.
1151
1166
let mut tokens = Vec :: new ( ) ;
1152
1167
let prev_collecting = match self . token_cursor . frame . last_token {
0 commit comments