@@ -145,6 +145,7 @@ struct TokenCursorFrame {
145145 tree_cursor : tokenstream:: Cursor ,
146146 close_delim : bool ,
147147 last_token : LastToken ,
148+ original_tree : Option < TokenTree > ,
148149}
149150
150151/// This is used in `TokenCursorFrame` above to track tokens that are consumed
@@ -171,14 +172,20 @@ enum LastToken {
171172}
172173
173174impl 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 {
175181 TokenCursorFrame {
176182 delim,
177183 span,
178184 open_delim : delim == token:: NoDelim ,
179185 tree_cursor : tts. clone ( ) . into_trees ( ) ,
180186 close_delim : delim == token:: NoDelim ,
181187 last_token : LastToken :: Was ( None ) ,
188+ original_tree,
182189 }
183190 }
184191}
@@ -206,10 +213,10 @@ impl TokenCursor {
206213 LastToken :: Was ( ref mut t) => * t = Some ( tree. clone ( ) . into ( ) ) ,
207214 }
208215
209- match tree {
216+ match tree. clone ( ) {
210217 TokenTree :: Token ( token) => return token,
211218 TokenTree :: Delimited ( sp, delim, tts) => {
212- let frame = TokenCursorFrame :: new ( sp, delim, & tts) ;
219+ let frame = TokenCursorFrame :: new ( sp, delim, & tts, Some ( tree ) ) ;
213220 self . stack . push ( mem:: replace ( & mut self . frame , frame) ) ;
214221 }
215222 }
@@ -270,6 +277,7 @@ impl TokenCursor {
270277 . cloned ( )
271278 . collect :: < TokenStream > ( )
272279 } ,
280+ None ,
273281 ) ,
274282 ) ) ;
275283
@@ -373,7 +381,7 @@ impl<'a> Parser<'a> {
373381 root_module_name : None ,
374382 expected_tokens : Vec :: new ( ) ,
375383 token_cursor : TokenCursor {
376- frame : TokenCursorFrame :: new ( DelimSpan :: dummy ( ) , token:: NoDelim , & tokens) ,
384+ frame : TokenCursorFrame :: new ( DelimSpan :: dummy ( ) , token:: NoDelim , & tokens, None ) ,
377385 stack : Vec :: new ( ) ,
378386 } ,
379387 desugar_doc_comments,
@@ -1147,6 +1155,13 @@ impl<'a> Parser<'a> {
11471155 & mut self ,
11481156 f : impl FnOnce ( & mut Self ) -> PResult < ' a , R > ,
11491157 ) -> 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+ }
11501165 // Record all tokens we parse when parsing this item.
11511166 let mut tokens = Vec :: new ( ) ;
11521167 let prev_collecting = match self . token_cursor . frame . last_token {
0 commit comments