File tree Expand file tree Collapse file tree 3 files changed +38
-15
lines changed Expand file tree Collapse file tree 3 files changed +38
-15
lines changed Original file line number Diff line number Diff line change @@ -476,24 +476,21 @@ pub fn parse(sess: &ParseSess,
476
476
}
477
477
rdr. next_token ( ) ;
478
478
} else /* bb_eis.len() == 1 */ {
479
- let mut rust_parser = Parser :: new ( sess, cfg. clone ( ) , Box :: new ( rdr. clone ( ) ) ) ;
480
-
481
- let mut ei = bb_eis. pop ( ) . unwrap ( ) ;
482
- match ei. top_elts . get_tt ( ei. idx ) {
483
- TokenTree :: Token ( span, MatchNt ( _, ident) ) => {
479
+ rdr. next_tok = {
480
+ let mut rust_parser = Parser :: new ( sess, cfg. clone ( ) , Box :: new ( & mut rdr) ) ;
481
+ let mut ei = bb_eis. pop ( ) . unwrap ( ) ;
482
+ if let TokenTree :: Token ( span, MatchNt ( _, ident) ) = ei. top_elts . get_tt ( ei. idx ) {
484
483
let match_cur = ei. match_cur ;
485
484
( & mut ei. matches [ match_cur] ) . push ( Rc :: new ( MatchedNonterminal (
486
485
parse_nt ( & mut rust_parser, span, & ident. name . as_str ( ) ) ) ) ) ;
487
486
ei. idx += 1 ;
488
487
ei. match_cur += 1 ;
488
+ } else {
489
+ unreachable ! ( )
489
490
}
490
- _ => panic ! ( )
491
- }
492
- cur_eis. push ( ei) ;
493
-
494
- for _ in 0 ..rust_parser. tokens_consumed {
495
- let _ = rdr. next_token ( ) ;
496
- }
491
+ cur_eis. push ( ei) ;
492
+ Some ( TokenAndSpan { tok : rust_parser. token , sp : rust_parser. span } )
493
+ } ;
497
494
}
498
495
}
499
496
Original file line number Diff line number Diff line change @@ -48,6 +48,7 @@ pub struct TtReader<'a> {
48
48
/* cached: */
49
49
pub cur_tok : Token ,
50
50
pub cur_span : Span ,
51
+ pub next_tok : Option < TokenAndSpan > ,
51
52
/// Transform doc comments. Only useful in macro invocations
52
53
pub desugar_doc_comments : bool ,
53
54
pub fatal_errs : Vec < DiagnosticBuilder < ' a > > ,
@@ -100,6 +101,7 @@ pub fn new_tt_reader_with_doc_flag(sp_diag: &Handler,
100
101
/* dummy values, never read: */
101
102
cur_tok : token:: Eof ,
102
103
cur_span : DUMMY_SP ,
104
+ next_tok : None ,
103
105
fatal_errs : Vec :: new ( ) ,
104
106
} ;
105
107
tt_next_token ( & mut r) ; /* get cur_tok and cur_span set up */
@@ -178,6 +180,9 @@ fn lockstep_iter_size(t: &TokenTree, r: &TtReader) -> LockstepIterSize {
178
180
/// Return the next token from the TtReader.
179
181
/// EFFECT: advances the reader's token field
180
182
pub fn tt_next_token ( r : & mut TtReader ) -> TokenAndSpan {
183
+ if let Some ( tok) = r. next_tok . take ( ) {
184
+ return tok;
185
+ }
181
186
// FIXME(pcwalton): Bad copy?
182
187
let ret_val = TokenAndSpan {
183
188
tok : r. cur_tok . clone ( ) ,
Original file line number Diff line number Diff line change @@ -144,7 +144,7 @@ impl<'a> Reader for StringReader<'a> {
144
144
145
145
impl < ' a > Reader for TtReader < ' a > {
146
146
fn is_eof ( & self ) -> bool {
147
- self . cur_tok == token:: Eof
147
+ self . peek ( ) . tok == token:: Eof
148
148
}
149
149
fn try_next_token ( & mut self ) -> Result < TokenAndSpan , ( ) > {
150
150
assert ! ( self . fatal_errs. is_empty( ) ) ;
@@ -165,10 +165,31 @@ impl<'a> Reader for TtReader<'a> {
165
165
self . fatal_errs . clear ( ) ;
166
166
}
167
167
fn peek ( & self ) -> TokenAndSpan {
168
- TokenAndSpan {
168
+ self . next_tok . clone ( ) . unwrap_or ( TokenAndSpan {
169
169
tok : self . cur_tok . clone ( ) ,
170
170
sp : self . cur_span ,
171
- }
171
+ } )
172
+ }
173
+ }
174
+
175
+ impl < ' a , ' b > Reader for & ' b mut TtReader < ' a > {
176
+ fn is_eof ( & self ) -> bool {
177
+ ( * * self ) . is_eof ( )
178
+ }
179
+ fn try_next_token ( & mut self ) -> Result < TokenAndSpan , ( ) > {
180
+ ( * * self ) . try_next_token ( )
181
+ }
182
+ fn fatal ( & self , m : & str ) -> FatalError {
183
+ ( * * self ) . fatal ( m)
184
+ }
185
+ fn err ( & self , m : & str ) {
186
+ ( * * self ) . err ( m)
187
+ }
188
+ fn emit_fatal_errors ( & mut self ) {
189
+ ( * * self ) . emit_fatal_errors ( )
190
+ }
191
+ fn peek ( & self ) -> TokenAndSpan {
192
+ ( * * self ) . peek ( )
172
193
}
173
194
}
174
195
You can’t perform that action at this time.
0 commit comments