@@ -5,7 +5,7 @@ use rustc_ast::tokenstream::{AttrAnnotatedTokenTree, DelimSpan, LazyTokenStream,
55use rustc_ast:: { self as ast} ;
66use rustc_ast:: { AstLike , AttrVec , Attribute } ;
77use rustc_errors:: PResult ;
8- use rustc_span:: { sym, Span , DUMMY_SP } ;
8+ use rustc_span:: { sym, Span } ;
99
1010use std:: convert:: TryInto ;
1111use std:: ops:: Range ;
@@ -400,24 +400,26 @@ fn make_token_stream(
400400) -> AttrAnnotatedTokenStream {
401401 #[ derive( Debug ) ]
402402 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 ) > ,
405405 inner : Vec < ( AttrAnnotatedTokenTree , Spacing ) > ,
406406 }
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![ ] } ] ;
409408 let mut token_and_spacing = iter. next ( ) ;
410409 while let Some ( ( token, spacing) ) = token_and_spacing {
411410 match token {
412411 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 ! [ ] } ) ;
414413 }
415414 FlatToken :: Token ( Token { kind : TokenKind :: CloseDelim ( delim) , span } ) => {
416415 // HACK: If we encounter a mismatched `None` delimiter at the top
417416 // level, just ignore it.
418417 if matches ! ( delim, DelimToken :: NoDelim )
419418 && ( 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+ ) )
421423 {
422424 token_and_spacing = iter. next ( ) ;
423425 continue ;
@@ -430,7 +432,7 @@ fn make_token_stream(
430432 // merge our current frame with the one above it. That is, transform
431433 // `[ { < first second } third ]` into `[ { first second } third ]`
432434 if !matches ! ( delim, DelimToken :: NoDelim )
433- && matches ! ( frame_data. open_delim , DelimToken :: NoDelim )
435+ && matches ! ( frame_data. open_delim_sp . unwrap ( ) . 0 , DelimToken :: NoDelim )
434436 {
435437 stack. last_mut ( ) . unwrap ( ) . inner . extend ( frame_data. inner ) ;
436438 // Process our closing delimiter again, this time at the previous
@@ -439,12 +441,13 @@ fn make_token_stream(
439441 continue ;
440442 }
441443
444+ let ( open_delim, open_sp) = frame_data. open_delim_sp . unwrap ( ) ;
442445 assert_eq ! (
443- frame_data . open_delim, delim,
446+ open_delim, delim,
444447 "Mismatched open/close delims: open={:?} close={:?}" ,
445- frame_data . open , span
448+ open_delim , span
446449 ) ;
447- let dspan = DelimSpan :: from_pair ( frame_data . open , span) ;
450+ let dspan = DelimSpan :: from_pair ( open_sp , span) ;
448451 let stream = AttrAnnotatedTokenStream :: new ( frame_data. inner ) ;
449452 let delimited = AttrAnnotatedTokenTree :: Delimited ( dspan, delim, stream) ;
450453 stack
@@ -472,7 +475,7 @@ fn make_token_stream(
472475 // HACK: If we don't have a closing `None` delimiter for our last
473476 // frame, merge the frame with the top-level frame. That is,
474477 // 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 {
476479 let temp_buf = stack. pop ( ) . unwrap ( ) ;
477480 stack. last_mut ( ) . unwrap ( ) . inner . extend ( temp_buf. inner ) ;
478481 }
0 commit comments