@@ -16,15 +16,14 @@ mod tests;
16
16
17
17
use span:: { Edition , Span , SyntaxContextId } ;
18
18
use syntax_bridge:: to_parser_input;
19
- use tt:: iter:: TtIter ;
20
- use tt:: DelimSpan ;
19
+ use tt:: { DelimSpan , RefTokenCursor , Token , TokenCursor , TokenKind , TokenStream } ;
21
20
22
21
use std:: fmt;
23
22
use std:: sync:: Arc ;
24
23
25
24
use crate :: parser:: { MetaTemplate , MetaVarKind , Op } ;
26
25
27
- pub use tt:: { Delimiter , DelimiterKind , Punct } ;
26
+ pub use tt:: Delimiter ;
28
27
29
28
#[ derive( Debug , PartialEq , Eq , Clone ) ]
30
29
pub enum ParseError {
@@ -141,30 +140,32 @@ impl DeclarativeMacro {
141
140
142
141
/// The old, `macro_rules! m {}` flavor.
143
142
pub fn parse_macro_rules (
144
- tt : & tt :: Subtree < Span > ,
143
+ stream : & TokenStream < Span > ,
145
144
ctx_edition : impl Copy + Fn ( SyntaxContextId ) -> Edition ,
146
145
) -> DeclarativeMacro {
147
146
// Note: this parsing can be implemented using mbe machinery itself, by
148
147
// matching against `$($lhs:tt => $rhs:tt);*` pattern, but implementing
149
148
// manually seems easier.
150
- let mut src = TtIter :: new ( tt ) ;
149
+ let mut cursor = RefTokenCursor :: new ( stream ) ;
151
150
let mut rules = Vec :: new ( ) ;
152
151
let mut err = None ;
153
152
154
- while src . len ( ) > 0 {
155
- let rule = match Rule :: parse ( ctx_edition, & mut src ) {
153
+ while let Some ( ( token , _ ) ) = cursor . next ( ) {
154
+ let rule = match Rule :: parse ( ctx_edition, & mut cursor ) {
156
155
Ok ( it) => it,
157
156
Err ( e) => {
158
157
err = Some ( Box :: new ( e) ) ;
159
158
break ;
160
159
}
161
160
} ;
162
161
rules. push ( rule) ;
163
- if let Err ( ( ) ) = src. expect_char ( ';' ) {
164
- if src. len ( ) > 0 {
162
+ match cursor. next ( ) {
163
+ Some ( ( Token { kind : TokenKind :: Semi , .. } , _) ) => ( ) ,
164
+ Some ( ( Token { span, .. } , _) ) => {
165
165
err = Some ( Box :: new ( ParseError :: expected ( "expected `;`" ) ) ) ;
166
+ break ;
166
167
}
167
- break ;
168
+ None => break ,
168
169
}
169
170
}
170
171
@@ -180,8 +181,8 @@ impl DeclarativeMacro {
180
181
181
182
/// The new, unstable `macro m {}` flavor.
182
183
pub fn parse_macro2 (
183
- args : Option < & tt:: Subtree < Span > > ,
184
- body : & tt:: Subtree < Span > ,
184
+ args : Option < & tt:: TokenStream < Span > > ,
185
+ body : & tt:: TokenStream < Span > ,
185
186
ctx_edition : impl Copy + Fn ( SyntaxContextId ) -> Edition ,
186
187
) -> DeclarativeMacro {
187
188
let mut rules = Vec :: new ( ) ;
@@ -203,23 +204,25 @@ impl DeclarativeMacro {
203
204
}
204
205
} else {
205
206
cov_mark:: hit!( parse_macro_def_rules) ;
206
- let mut src = TtIter :: new ( body) ;
207
- while src . len ( ) > 0 {
208
- let rule = match Rule :: parse ( ctx_edition, & mut src ) {
207
+ let mut cursor = RefTokenCursor :: new ( body) ;
208
+ while let Some ( ( token , _ ) ) = cursor . next ( ) {
209
+ let rule = match Rule :: parse ( ctx_edition, & mut cursor ) {
209
210
Ok ( it) => it,
210
211
Err ( e) => {
211
212
err = Some ( Box :: new ( e) ) ;
212
213
break ;
213
214
}
214
215
} ;
215
216
rules. push ( rule) ;
216
- if let Err ( ( ) ) = src. expect_any_char ( & [ ';' , ',' ] ) {
217
- if src. len ( ) > 0 {
217
+ match cursor. next ( ) {
218
+ Some ( ( Token { kind : TokenKind :: Semi | TokenKind :: Comma , .. } , _) ) => ( ) ,
219
+ Some ( ( Token { span, .. } , _) ) => {
218
220
err = Some ( Box :: new ( ParseError :: expected (
219
221
"expected `;` or `,` to delimit rules" ,
220
222
) ) ) ;
223
+ break ;
221
224
}
222
- break ;
225
+ None => break ,
223
226
}
224
227
}
225
228
}
@@ -244,19 +247,19 @@ impl DeclarativeMacro {
244
247
245
248
pub fn expand (
246
249
& self ,
247
- tt : & tt:: Subtree < Span > ,
250
+ tt : & tt:: TokenStream < Span > ,
248
251
marker : impl Fn ( & mut Span ) + Copy ,
249
252
call_site : Span ,
250
253
def_site_edition : Edition ,
251
- ) -> ExpandResult < ( tt:: Subtree < Span > , MatchedArmIndex ) > {
254
+ ) -> ExpandResult < ( tt:: TokenStream < Span > , MatchedArmIndex ) > {
252
255
expander:: expand_rules ( & self . rules , tt, marker, call_site, def_site_edition)
253
256
}
254
257
}
255
258
256
259
impl Rule {
257
260
fn parse (
258
261
edition : impl Copy + Fn ( SyntaxContextId ) -> Edition ,
259
- src : & mut TtIter < ' _ , Span > ,
262
+ src : & mut RefTokenCursor < ' _ , Span > ,
260
263
) -> Result < Self , ParseError > {
261
264
let lhs = src. expect_subtree ( ) . map_err ( |( ) | ParseError :: expected ( "expected subtree" ) ) ?;
262
265
src. expect_char ( '=' ) . map_err ( |( ) | ParseError :: expected ( "expected `=`" ) ) ?;
@@ -353,31 +356,26 @@ impl<T: Default, E> From<Result<T, E>> for ValueResult<T, E> {
353
356
}
354
357
355
358
pub fn expect_fragment (
356
- tt_iter : & mut TtIter < ' _ , Span > ,
359
+ cursor : & mut RefTokenCursor < ' _ , Span > ,
357
360
entry_point : :: parser:: PrefixEntryPoint ,
358
361
edition : :: parser:: Edition ,
359
362
delim_span : DelimSpan < Span > ,
360
363
) -> ExpandResult < Option < tt:: TokenTree < Span > > > {
361
364
use :: parser;
362
- let buffer = tt:: buffer:: TokenBuffer :: from_tokens ( tt_iter. as_slice ( ) ) ;
363
- let parser_input = to_parser_input ( edition, & buffer) ;
365
+ let parser_input = to_parser_input ( edition, cursor. clone ( ) ) ;
364
366
let tree_traversal = entry_point. parse ( & parser_input, edition) ;
365
- let mut cursor = buffer. begin ( ) ;
366
367
let mut error = false ;
367
368
for step in tree_traversal. iter ( ) {
368
369
match step {
369
370
parser:: Step :: Token { kind, mut n_input_tokens } => {
370
- if kind == :: parser:: SyntaxKind :: LIFETIME_IDENT {
371
- n_input_tokens = 2 ;
372
- }
373
371
for _ in 0 ..n_input_tokens {
374
- cursor = cursor . bump_subtree ( ) ;
372
+ cursor. next ( ) ;
375
373
}
376
374
}
377
375
parser:: Step :: FloatSplit { .. } => {
378
376
// FIXME: We need to split the tree properly here, but mutating the token trees
379
377
// in the buffer is somewhat tricky to pull off.
380
- cursor = cursor . bump_subtree ( ) ;
378
+ cursor. next ( ) ;
381
379
}
382
380
parser:: Step :: Enter { .. } | parser:: Step :: Exit => ( ) ,
383
381
parser:: Step :: Error { .. } => error = true ,
@@ -402,7 +400,7 @@ pub fn expect_fragment(
402
400
curr = curr. bump ( ) ;
403
401
}
404
402
405
- * tt_iter = TtIter :: new_iter ( tt_iter . as_slice ( ) [ res. len ( ) ..] . iter ( ) ) ;
403
+ * cursor = TtIter :: new_iter ( cursor . as_slice ( ) [ res. len ( ) ..] . iter ( ) ) ;
406
404
let res = match & * res {
407
405
[ ] | [ _] => res. pop ( ) ,
408
406
[ first, ..] => Some ( tt:: TokenTree :: Subtree ( tt:: Subtree {
0 commit comments