@@ -23,15 +23,14 @@ mod tests;
23
23
24
24
use span:: { Edition , Span , SyntaxContextId } ;
25
25
use syntax_bridge:: to_parser_input;
26
- use tt:: iter:: TtIter ;
27
- use tt:: DelimSpan ;
26
+ use tt:: { DelimSpan , RefTokenCursor , Token , TokenCursor , TokenKind , TokenStream } ;
28
27
29
28
use std:: fmt;
30
29
use std:: sync:: Arc ;
31
30
32
31
use crate :: parser:: { MetaTemplate , MetaVarKind , Op } ;
33
32
34
- pub use tt:: { Delimiter , DelimiterKind , Punct } ;
33
+ pub use tt:: Delimiter ;
35
34
36
35
#[ derive( Debug , PartialEq , Eq , Clone ) ]
37
36
pub enum ParseError {
@@ -148,30 +147,32 @@ impl DeclarativeMacro {
148
147
149
148
/// The old, `macro_rules! m {}` flavor.
150
149
pub fn parse_macro_rules (
151
- tt : & tt :: Subtree < Span > ,
150
+ stream : & TokenStream < Span > ,
152
151
ctx_edition : impl Copy + Fn ( SyntaxContextId ) -> Edition ,
153
152
) -> DeclarativeMacro {
154
153
// Note: this parsing can be implemented using mbe machinery itself, by
155
154
// matching against `$($lhs:tt => $rhs:tt);*` pattern, but implementing
156
155
// manually seems easier.
157
- let mut src = TtIter :: new ( tt ) ;
156
+ let mut cursor = RefTokenCursor :: new ( stream ) ;
158
157
let mut rules = Vec :: new ( ) ;
159
158
let mut err = None ;
160
159
161
- while src . len ( ) > 0 {
162
- let rule = match Rule :: parse ( ctx_edition, & mut src ) {
160
+ while let Some ( ( token , _ ) ) = cursor . next ( ) {
161
+ let rule = match Rule :: parse ( ctx_edition, & mut cursor ) {
163
162
Ok ( it) => it,
164
163
Err ( e) => {
165
164
err = Some ( Box :: new ( e) ) ;
166
165
break ;
167
166
}
168
167
} ;
169
168
rules. push ( rule) ;
170
- if let Err ( ( ) ) = src. expect_char ( ';' ) {
171
- if src. len ( ) > 0 {
169
+ match cursor. next ( ) {
170
+ Some ( ( Token { kind : TokenKind :: Semi , .. } , _) ) => ( ) ,
171
+ Some ( ( Token { span, .. } , _) ) => {
172
172
err = Some ( Box :: new ( ParseError :: expected ( "expected `;`" ) ) ) ;
173
+ break ;
173
174
}
174
- break ;
175
+ None => break ,
175
176
}
176
177
}
177
178
@@ -187,8 +188,8 @@ impl DeclarativeMacro {
187
188
188
189
/// The new, unstable `macro m {}` flavor.
189
190
pub fn parse_macro2 (
190
- args : Option < & tt:: Subtree < Span > > ,
191
- body : & tt:: Subtree < Span > ,
191
+ args : Option < & tt:: TokenStream < Span > > ,
192
+ body : & tt:: TokenStream < Span > ,
192
193
ctx_edition : impl Copy + Fn ( SyntaxContextId ) -> Edition ,
193
194
) -> DeclarativeMacro {
194
195
let mut rules = Vec :: new ( ) ;
@@ -210,23 +211,25 @@ impl DeclarativeMacro {
210
211
}
211
212
} else {
212
213
cov_mark:: hit!( parse_macro_def_rules) ;
213
- let mut src = TtIter :: new ( body) ;
214
- while src . len ( ) > 0 {
215
- let rule = match Rule :: parse ( ctx_edition, & mut src ) {
214
+ let mut cursor = RefTokenCursor :: new ( body) ;
215
+ while let Some ( ( token , _ ) ) = cursor . next ( ) {
216
+ let rule = match Rule :: parse ( ctx_edition, & mut cursor ) {
216
217
Ok ( it) => it,
217
218
Err ( e) => {
218
219
err = Some ( Box :: new ( e) ) ;
219
220
break ;
220
221
}
221
222
} ;
222
223
rules. push ( rule) ;
223
- if let Err ( ( ) ) = src. expect_any_char ( & [ ';' , ',' ] ) {
224
- if src. len ( ) > 0 {
224
+ match cursor. next ( ) {
225
+ Some ( ( Token { kind : TokenKind :: Semi | TokenKind :: Comma , .. } , _) ) => ( ) ,
226
+ Some ( ( Token { span, .. } , _) ) => {
225
227
err = Some ( Box :: new ( ParseError :: expected (
226
228
"expected `;` or `,` to delimit rules" ,
227
229
) ) ) ;
230
+ break ;
228
231
}
229
- break ;
232
+ None => break ,
230
233
}
231
234
}
232
235
}
@@ -251,19 +254,19 @@ impl DeclarativeMacro {
251
254
252
255
pub fn expand (
253
256
& self ,
254
- tt : & tt:: Subtree < Span > ,
257
+ tt : & tt:: TokenStream < Span > ,
255
258
marker : impl Fn ( & mut Span ) + Copy ,
256
259
call_site : Span ,
257
260
def_site_edition : Edition ,
258
- ) -> ExpandResult < ( tt:: Subtree < Span > , MatchedArmIndex ) > {
261
+ ) -> ExpandResult < ( tt:: TokenStream < Span > , MatchedArmIndex ) > {
259
262
expander:: expand_rules ( & self . rules , tt, marker, call_site, def_site_edition)
260
263
}
261
264
}
262
265
263
266
impl Rule {
264
267
fn parse (
265
268
edition : impl Copy + Fn ( SyntaxContextId ) -> Edition ,
266
- src : & mut TtIter < ' _ , Span > ,
269
+ src : & mut RefTokenCursor < ' _ , Span > ,
267
270
) -> Result < Self , ParseError > {
268
271
let lhs = src. expect_subtree ( ) . map_err ( |( ) | ParseError :: expected ( "expected subtree" ) ) ?;
269
272
src. expect_char ( '=' ) . map_err ( |( ) | ParseError :: expected ( "expected `=`" ) ) ?;
@@ -360,31 +363,26 @@ impl<T: Default, E> From<Result<T, E>> for ValueResult<T, E> {
360
363
}
361
364
362
365
pub fn expect_fragment (
363
- tt_iter : & mut TtIter < ' _ , Span > ,
366
+ cursor : & mut RefTokenCursor < ' _ , Span > ,
364
367
entry_point : :: parser:: PrefixEntryPoint ,
365
368
edition : :: parser:: Edition ,
366
369
delim_span : DelimSpan < Span > ,
367
370
) -> ExpandResult < Option < tt:: TokenTree < Span > > > {
368
371
use :: parser;
369
- let buffer = tt:: buffer:: TokenBuffer :: from_tokens ( tt_iter. as_slice ( ) ) ;
370
- let parser_input = to_parser_input ( edition, & buffer) ;
372
+ let parser_input = to_parser_input ( edition, cursor. clone ( ) ) ;
371
373
let tree_traversal = entry_point. parse ( & parser_input, edition) ;
372
- let mut cursor = buffer. begin ( ) ;
373
374
let mut error = false ;
374
375
for step in tree_traversal. iter ( ) {
375
376
match step {
376
377
parser:: Step :: Token { kind, mut n_input_tokens } => {
377
- if kind == :: parser:: SyntaxKind :: LIFETIME_IDENT {
378
- n_input_tokens = 2 ;
379
- }
380
378
for _ in 0 ..n_input_tokens {
381
- cursor = cursor . bump_subtree ( ) ;
379
+ cursor. next ( ) ;
382
380
}
383
381
}
384
382
parser:: Step :: FloatSplit { .. } => {
385
383
// FIXME: We need to split the tree properly here, but mutating the token trees
386
384
// in the buffer is somewhat tricky to pull off.
387
- cursor = cursor . bump_subtree ( ) ;
385
+ cursor. next ( ) ;
388
386
}
389
387
parser:: Step :: Enter { .. } | parser:: Step :: Exit => ( ) ,
390
388
parser:: Step :: Error { .. } => error = true ,
@@ -409,7 +407,7 @@ pub fn expect_fragment(
409
407
curr = curr. bump ( ) ;
410
408
}
411
409
412
- * tt_iter = TtIter :: new_iter ( tt_iter . as_slice ( ) [ res. len ( ) ..] . iter ( ) ) ;
410
+ * cursor = TtIter :: new_iter ( cursor . as_slice ( ) [ res. len ( ) ..] . iter ( ) ) ;
413
411
let res = match & * res {
414
412
[ ] | [ _] => res. pop ( ) ,
415
413
[ first, ..] => Some ( tt:: TokenTree :: Subtree ( tt:: Subtree {
0 commit comments