@@ -5,7 +5,7 @@ use rustc_ast::tokenstream::{AttrAnnotatedTokenTree, DelimSpan, LazyTokenStream,
5
5
use rustc_ast:: { self as ast} ;
6
6
use rustc_ast:: { AstLike , AttrVec , Attribute } ;
7
7
use rustc_errors:: PResult ;
8
- use rustc_span:: { sym, Span , DUMMY_SP } ;
8
+ use rustc_span:: { sym, Span } ;
9
9
10
10
use std:: convert:: TryInto ;
11
11
use std:: ops:: Range ;
@@ -400,24 +400,26 @@ fn make_token_stream(
400
400
) -> AttrAnnotatedTokenStream {
401
401
#[ derive( Debug ) ]
402
402
struct FrameData {
403
- open : Span ,
404
- open_delim : DelimToken ,
403
+ // This is `None` for the first frame, `Some` for all others.
404
+ open_delim_sp : Option < ( DelimToken , Span ) > ,
405
405
inner : Vec < ( AttrAnnotatedTokenTree , Spacing ) > ,
406
406
}
407
- let mut stack =
408
- vec ! [ FrameData { open: DUMMY_SP , open_delim: DelimToken :: NoDelim , inner: vec![ ] } ] ;
407
+ let mut stack = vec ! [ FrameData { open_delim_sp: None , inner: vec![ ] } ] ;
409
408
let mut token_and_spacing = iter. next ( ) ;
410
409
while let Some ( ( token, spacing) ) = token_and_spacing {
411
410
match token {
412
411
FlatToken :: Token ( Token { kind : TokenKind :: OpenDelim ( delim) , span } ) => {
413
- stack. push ( FrameData { open : span , open_delim : delim , inner : vec ! [ ] } ) ;
412
+ stack. push ( FrameData { open_delim_sp : Some ( ( delim , span ) ) , inner : vec ! [ ] } ) ;
414
413
}
415
414
FlatToken :: Token ( Token { kind : TokenKind :: CloseDelim ( delim) , span } ) => {
416
415
// HACK: If we encounter a mismatched `None` delimiter at the top
417
416
// level, just ignore it.
418
417
if matches ! ( delim, DelimToken :: NoDelim )
419
418
&& ( stack. len ( ) == 1
420
- || !matches ! ( stack. last_mut( ) . unwrap( ) . open_delim, DelimToken :: NoDelim ) )
419
+ || !matches ! (
420
+ stack. last_mut( ) . unwrap( ) . open_delim_sp. unwrap( ) . 0 ,
421
+ DelimToken :: NoDelim
422
+ ) )
421
423
{
422
424
token_and_spacing = iter. next ( ) ;
423
425
continue ;
@@ -430,7 +432,7 @@ fn make_token_stream(
430
432
// merge our current frame with the one above it. That is, transform
431
433
// `[ { < first second } third ]` into `[ { first second } third ]`
432
434
if !matches ! ( delim, DelimToken :: NoDelim )
433
- && matches ! ( frame_data. open_delim , DelimToken :: NoDelim )
435
+ && matches ! ( frame_data. open_delim_sp . unwrap ( ) . 0 , DelimToken :: NoDelim )
434
436
{
435
437
stack. last_mut ( ) . unwrap ( ) . inner . extend ( frame_data. inner ) ;
436
438
// Process our closing delimiter again, this time at the previous
@@ -439,12 +441,13 @@ fn make_token_stream(
439
441
continue ;
440
442
}
441
443
444
+ let ( open_delim, open_sp) = frame_data. open_delim_sp . unwrap ( ) ;
442
445
assert_eq ! (
443
- frame_data . open_delim, delim,
446
+ open_delim, delim,
444
447
"Mismatched open/close delims: open={:?} close={:?}" ,
445
- frame_data . open , span
448
+ open_delim , span
446
449
) ;
447
- let dspan = DelimSpan :: from_pair ( frame_data . open , span) ;
450
+ let dspan = DelimSpan :: from_pair ( open_sp , span) ;
448
451
let stream = AttrAnnotatedTokenStream :: new ( frame_data. inner ) ;
449
452
let delimited = AttrAnnotatedTokenTree :: Delimited ( dspan, delim, stream) ;
450
453
stack
@@ -472,7 +475,7 @@ fn make_token_stream(
472
475
// HACK: If we don't have a closing `None` delimiter for our last
473
476
// frame, merge the frame with the top-level frame. That is,
474
477
// turn `< first second` into `first second`
475
- if stack. len ( ) == 2 && stack[ 1 ] . open_delim == DelimToken :: NoDelim {
478
+ if stack. len ( ) == 2 && stack[ 1 ] . open_delim_sp . unwrap ( ) . 0 == DelimToken :: NoDelim {
476
479
let temp_buf = stack. pop ( ) . unwrap ( ) ;
477
480
stack. last_mut ( ) . unwrap ( ) . inner . extend ( temp_buf. inner ) ;
478
481
}
0 commit comments