@@ -14,7 +14,7 @@ use syntax_pos::{Span, DUMMY_SP};
1414use errors:: { Handler , DiagnosticBuilder } ;
1515use ext:: tt:: macro_parser:: { NamedMatch , MatchedSeq , MatchedNonterminal } ;
1616use parse:: token:: { DocComment , MatchNt , SubstNt } ;
17- use parse:: token:: { Token , NtIdent , SpecialMacroVar } ;
17+ use parse:: token:: { Token , Interpolated , NtIdent , NtTT , SpecialMacroVar } ;
1818use parse:: token;
1919use parse:: lexer:: TokenAndSpan ;
2020use tokenstream:: { self , TokenTree } ;
@@ -278,9 +278,9 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
278278 }
279279 // FIXME #2887: think about span stuff here
280280 TokenTree :: Token ( sp, SubstNt ( ident) ) => {
281- r. stack . last_mut ( ) . unwrap ( ) . idx += 1 ;
282281 match lookup_cur_matched ( r, ident) {
283282 None => {
283+ r. stack . last_mut ( ) . unwrap ( ) . idx += 1 ;
284284 r. cur_span = sp;
285285 r. cur_tok = SubstNt ( ident) ;
286286 return ret_val;
@@ -292,14 +292,24 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
292292 // (a) idents can be in lots of places, so it'd be a pain
293293 // (b) we actually can, since it's a token.
294294 MatchedNonterminal ( NtIdent ( ref sn) ) => {
295+ r. stack . last_mut ( ) . unwrap ( ) . idx += 1 ;
295296 r. cur_span = sn. span ;
296297 r. cur_tok = token:: Ident ( sn. node ) ;
297298 return ret_val;
298299 }
300+ MatchedNonterminal ( NtTT ( ref tt) ) => {
301+ r. stack . push ( TtFrame {
302+ forest : TokenTree :: Token ( sp, Interpolated ( NtTT ( tt. clone ( ) ) ) ) ,
303+ idx : 0 ,
304+ dotdotdoted : false ,
305+ sep : None ,
306+ } ) ;
307+ }
299308 MatchedNonterminal ( ref other_whole_nt) => {
309+ r. stack . last_mut ( ) . unwrap ( ) . idx += 1 ;
300310 // FIXME(pcwalton): Bad copy.
301311 r. cur_span = sp;
302- r. cur_tok = token :: Interpolated ( ( * other_whole_nt) . clone ( ) ) ;
312+ r. cur_tok = Interpolated ( ( * other_whole_nt) . clone ( ) ) ;
303313 return ret_val;
304314 }
305315 MatchedSeq ( ..) => {
0 commit comments