@@ -244,14 +244,13 @@ struct TokenCursor {
244
244
245
245
#[ derive( Clone ) ]
246
246
struct TokenCursorFrame {
247
- delim : token:: DelimToken ,
248
- span : DelimSpan ,
247
+ delim_sp : Option < ( DelimToken , DelimSpan ) > ,
249
248
tree_cursor : tokenstream:: Cursor ,
250
249
}
251
250
252
251
impl TokenCursorFrame {
253
- fn new ( span : DelimSpan , delim : DelimToken , tts : TokenStream ) -> Self {
254
- TokenCursorFrame { delim , span , tree_cursor : tts. into_trees ( ) }
252
+ fn new ( delim_sp : Option < ( DelimToken , DelimSpan ) > , tts : TokenStream ) -> Self {
253
+ TokenCursorFrame { delim_sp , tree_cursor : tts. into_trees ( ) }
255
254
}
256
255
}
257
256
@@ -266,7 +265,7 @@ impl TokenCursor {
266
265
loop {
267
266
// FIXME: we currently don't return `NoDelim` open/close delims. To fix #67062 we will
268
267
// need to, whereupon the `delim != DelimToken::NoDelim` conditions below can be
269
- // removed, as well as the loop .
268
+ // removed.
270
269
if let Some ( ( tree, spacing) ) = self . frame . tree_cursor . next_with_spacing_ref ( ) {
271
270
match tree {
272
271
& TokenTree :: Token ( ref token) => match ( desugar_doc_comments, token) {
@@ -277,7 +276,7 @@ impl TokenCursor {
277
276
} ,
278
277
& TokenTree :: Delimited ( sp, delim, ref tts) => {
279
278
// Set `open_delim` to true here because we deal with it immediately.
280
- let frame = TokenCursorFrame :: new ( sp , delim , tts. clone ( ) ) ;
279
+ let frame = TokenCursorFrame :: new ( Some ( ( delim , sp ) ) , tts. clone ( ) ) ;
281
280
self . stack . push ( mem:: replace ( & mut self . frame , frame) ) ;
282
281
if delim != DelimToken :: NoDelim {
283
282
return ( Token :: new ( token:: OpenDelim ( delim) , sp. open ) , Spacing :: Alone ) ;
@@ -286,12 +285,11 @@ impl TokenCursor {
286
285
}
287
286
} ;
288
287
} else if let Some ( frame) = self . stack . pop ( ) {
289
- let delim = self . frame . delim ;
290
- let span = self . frame . span ;
291
- self . frame = frame;
292
- if delim != DelimToken :: NoDelim {
288
+ if let Some ( ( delim, span) ) = self . frame . delim_sp && delim != DelimToken :: NoDelim {
289
+ self . frame = frame;
293
290
return ( Token :: new ( token:: CloseDelim ( delim) , span. close ) , Spacing :: Alone ) ;
294
291
}
292
+ self . frame = frame;
295
293
// No close delimiter to return; continue on to the next iteration.
296
294
} else {
297
295
return ( Token :: new ( token:: Eof , DUMMY_SP ) , Spacing :: Alone ) ;
@@ -330,8 +328,7 @@ impl TokenCursor {
330
328
self . stack . push ( mem:: replace (
331
329
& mut self . frame ,
332
330
TokenCursorFrame :: new (
333
- delim_span,
334
- token:: NoDelim ,
331
+ None ,
335
332
if attr_style == AttrStyle :: Inner {
336
333
[ TokenTree :: token ( token:: Pound , span) , TokenTree :: token ( token:: Not , span) , body]
337
334
. iter ( )
@@ -431,10 +428,6 @@ impl<'a> Parser<'a> {
431
428
desugar_doc_comments : bool ,
432
429
subparser_name : Option < & ' static str > ,
433
430
) -> Self {
434
- // Note: because of the way `TokenCursor::inlined_next` is structured, the `span` and
435
- // `delim` arguments here are never used.
436
- let start_frame = TokenCursorFrame :: new ( DelimSpan :: dummy ( ) , token:: NoDelim , tokens) ;
437
-
438
431
let mut parser = Parser {
439
432
sess,
440
433
token : Token :: dummy ( ) ,
@@ -444,7 +437,7 @@ impl<'a> Parser<'a> {
444
437
restrictions : Restrictions :: empty ( ) ,
445
438
expected_tokens : Vec :: new ( ) ,
446
439
token_cursor : TokenCursor {
447
- frame : start_frame ,
440
+ frame : TokenCursorFrame :: new ( None , tokens ) ,
448
441
stack : Vec :: new ( ) ,
449
442
num_next_calls : 0 ,
450
443
desugar_doc_comments,
@@ -1025,7 +1018,7 @@ impl<'a> Parser<'a> {
1025
1018
}
1026
1019
1027
1020
let frame = & self . token_cursor . frame ;
1028
- if frame. delim != DelimToken :: NoDelim {
1021
+ if let Some ( ( delim , span ) ) = frame. delim_sp && delim != DelimToken :: NoDelim {
1029
1022
let all_normal = ( 0 ..dist) . all ( |i| {
1030
1023
let token = frame. tree_cursor . look_ahead ( i) ;
1031
1024
!matches ! ( token, Some ( TokenTree :: Delimited ( _, DelimToken :: NoDelim , _) ) )
@@ -1038,7 +1031,7 @@ impl<'a> Parser<'a> {
1038
1031
looker ( & Token :: new ( token:: OpenDelim ( * delim) , dspan. open ) )
1039
1032
}
1040
1033
} ,
1041
- None => looker ( & Token :: new ( token:: CloseDelim ( frame . delim ) , frame . span . close ) ) ,
1034
+ None => looker ( & Token :: new ( token:: CloseDelim ( delim) , span. close ) ) ,
1042
1035
} ;
1043
1036
}
1044
1037
}
@@ -1198,8 +1191,7 @@ impl<'a> Parser<'a> {
1198
1191
// Grab the tokens from this frame.
1199
1192
let frame = & self . token_cursor . frame ;
1200
1193
let stream = frame. tree_cursor . stream . clone ( ) ;
1201
- let span = frame. span ;
1202
- let delim = frame. delim ;
1194
+ let ( delim, span) = frame. delim_sp . unwrap ( ) ;
1203
1195
1204
1196
// Advance the token cursor through the entire delimited
1205
1197
// sequence. After getting the `OpenDelim` we are *within* the
0 commit comments