10
10
use self :: LockstepIterSize :: * ;
11
11
12
12
use ast;
13
+ use ptr;
13
14
use ast:: { TokenTree , Ident , Name } ;
14
15
use codemap:: { Span , DUMMY_SP } ;
15
16
use errors:: Handler ;
16
17
use ext:: tt:: macro_parser:: { NamedMatch , MatchedSeq , MatchedNonterminal } ;
17
18
use parse:: token:: { DocComment , MatchNt , SubstNt } ;
18
- use parse:: token:: { Token , NtIdent , SpecialMacroVar } ;
19
+ use parse:: token:: { Token , NtIdent , NtExpr , SpecialMacroVar } ;
19
20
use parse:: token;
20
21
use parse:: lexer:: TokenAndSpan ;
21
22
@@ -173,6 +174,11 @@ fn lockstep_iter_size(t: &TokenTree, r: &TtReader) -> LockstepIterSize {
173
174
}
174
175
}
175
176
177
+ fn update_span ( base : Span , expr : & mut ast:: Expr ) {
178
+ expr. span . lo = base. lo ;
179
+ expr. span . hi = base. hi ;
180
+ }
181
+
176
182
/// Return the next token from the TtReader.
177
183
/// EFFECT: advances the reader's token field
178
184
pub fn tt_next_token ( r : & mut TtReader ) -> TokenAndSpan {
@@ -279,6 +285,7 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
279
285
}
280
286
// FIXME #2887: think about span stuff here
281
287
TokenTree :: Token ( sp, SubstNt ( ident, namep) ) => {
288
+ //println!("SubstNt {:?} {:?}", ident, sp);
282
289
r. stack . last_mut ( ) . unwrap ( ) . idx += 1 ;
283
290
match lookup_cur_matched ( r, ident) {
284
291
None => {
@@ -293,10 +300,18 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
293
300
// (a) idents can be in lots of places, so it'd be a pain
294
301
// (b) we actually can, since it's a token.
295
302
MatchedNonterminal ( NtIdent ( ref sn, b) ) => {
296
- r. cur_span = sn . span ;
303
+ r. cur_span = sp ;
297
304
r. cur_tok = token:: Ident ( sn. node , b) ;
298
305
return ret_val;
299
306
}
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
+ }
300
315
MatchedNonterminal ( ref other_whole_nt) => {
301
316
// FIXME(pcwalton): Bad copy.
302
317
r. cur_span = sp;
0 commit comments