1010use self :: LockstepIterSize :: * ;
1111
1212use ast;
13+ use ptr;
1314use ast:: { TokenTree , Ident , Name } ;
1415use codemap:: { Span , DUMMY_SP } ;
1516use errors:: Handler ;
1617use ext:: tt:: macro_parser:: { NamedMatch , MatchedSeq , MatchedNonterminal } ;
1718use parse:: token:: { DocComment , MatchNt , SubstNt } ;
18- use parse:: token:: { Token , NtIdent , SpecialMacroVar } ;
19+ use parse:: token:: { Token , NtIdent , NtExpr , SpecialMacroVar } ;
1920use parse:: token;
2021use parse:: lexer:: TokenAndSpan ;
2122
@@ -173,6 +174,11 @@ fn lockstep_iter_size(t: &TokenTree, r: &TtReader) -> LockstepIterSize {
173174 }
174175}
175176
177+ fn update_span ( base : Span , expr : & mut ast:: Expr ) {
178+ expr. span . lo = base. lo ;
179+ expr. span . hi = base. hi ;
180+ }
181+
176182/// Return the next token from the TtReader.
177183/// EFFECT: advances the reader's token field
178184pub fn tt_next_token ( r : & mut TtReader ) -> TokenAndSpan {
@@ -279,6 +285,7 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
279285 }
280286 // FIXME #2887: think about span stuff here
281287 TokenTree :: Token ( sp, SubstNt ( ident, namep) ) => {
288+ //println!("SubstNt {:?} {:?}", ident, sp);
282289 r. stack . last_mut ( ) . unwrap ( ) . idx += 1 ;
283290 match lookup_cur_matched ( r, ident) {
284291 None => {
@@ -293,10 +300,18 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
293300 // (a) idents can be in lots of places, so it'd be a pain
294301 // (b) we actually can, since it's a token.
295302 MatchedNonterminal ( NtIdent ( ref sn, b) ) => {
296- r. cur_span = sn . span ;
303+ r. cur_span = sp ;
297304 r. cur_tok = token:: Ident ( sn. node , b) ;
298305 return ret_val;
299306 }
307+ MatchedNonterminal ( NtExpr ( ref expr) ) => {
308+ let mut expr = ( * * expr) . clone ( ) ;
309+ update_span ( sp, & mut expr) ;
310+ // FIXME(pcwalton): Bad copy.
311+ r. cur_span = sp;
312+ r. cur_tok = token:: Interpolated ( NtExpr ( ptr:: P ( expr) ) ) ;
313+ return ret_val;
314+ }
300315 MatchedNonterminal ( ref other_whole_nt) => {
301316 // FIXME(pcwalton): Bad copy.
302317 r. cur_span = sp;
0 commit comments