@@ -123,7 +123,7 @@ impl TokenTree {
123
123
}
124
124
125
125
pub fn joint ( self ) -> TokenStream {
126
- TokenStream { kind : TokenStreamKind :: JointTree ( self ) }
126
+ TokenStream :: JointTree ( self )
127
127
}
128
128
129
129
/// Returns the opening delimiter as a token tree.
@@ -154,8 +154,11 @@ impl TokenTree {
154
154
/// instead of a representation of the abstract syntax tree.
155
155
/// Today's `TokenTree`s can still contain AST via `Token::Interpolated` for back-compat.
156
156
#[ derive( Clone , Debug ) ]
157
- pub struct TokenStream {
158
- kind : TokenStreamKind ,
157
+ pub enum TokenStream {
158
+ Empty ,
159
+ Tree ( TokenTree ) ,
160
+ JointTree ( TokenTree ) ,
161
+ Stream ( Lrc < Vec < TokenStream > > ) ,
159
162
}
160
163
161
164
// `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger.
@@ -167,24 +170,22 @@ impl TokenStream {
167
170
/// separating the two arguments with a comma for diagnostic suggestions.
168
171
pub ( crate ) fn add_comma ( & self ) -> Option < ( TokenStream , Span ) > {
169
172
// Used to suggest if a user writes `foo!(a b);`
170
- if let TokenStreamKind :: Stream ( ref stream) = self . kind {
173
+ if let TokenStream :: Stream ( ref stream) = self {
171
174
let mut suggestion = None ;
172
175
let mut iter = stream. iter ( ) . enumerate ( ) . peekable ( ) ;
173
176
while let Some ( ( pos, ts) ) = iter. next ( ) {
174
177
if let Some ( ( _, next) ) = iter. peek ( ) {
175
- let sp = match ( & ts. kind , & next. kind ) {
176
- ( TokenStreamKind :: Tree ( TokenTree :: Token ( _, token:: Token :: Comma ) ) , _) |
177
- ( _, TokenStreamKind :: Tree ( TokenTree :: Token ( _, token:: Token :: Comma ) ) ) => {
178
+ let sp = match ( & ts, & next) {
179
+ ( TokenStream :: Tree ( TokenTree :: Token ( _, token:: Token :: Comma ) ) , _) |
180
+ ( _, TokenStream :: Tree ( TokenTree :: Token ( _, token:: Token :: Comma ) ) ) => {
178
181
continue ;
179
182
}
180
- ( TokenStreamKind :: Tree ( TokenTree :: Token ( sp, _) ) , _) => * sp,
181
- ( TokenStreamKind :: Tree ( TokenTree :: Delimited ( sp, ..) ) , _) => sp. entire ( ) ,
183
+ ( TokenStream :: Tree ( TokenTree :: Token ( sp, _) ) , _) => * sp,
184
+ ( TokenStream :: Tree ( TokenTree :: Delimited ( sp, ..) ) , _) => sp. entire ( ) ,
182
185
_ => continue ,
183
186
} ;
184
187
let sp = sp. shrink_to_hi ( ) ;
185
- let comma = TokenStream {
186
- kind : TokenStreamKind :: Tree ( TokenTree :: Token ( sp, token:: Comma ) ) ,
187
- } ;
188
+ let comma = TokenStream :: Tree ( TokenTree :: Token ( sp, token:: Comma ) ) ;
188
189
suggestion = Some ( ( pos, comma, sp) ) ;
189
190
}
190
191
}
@@ -201,17 +202,9 @@ impl TokenStream {
201
202
}
202
203
}
203
204
204
- #[ derive( Clone , Debug ) ]
205
- enum TokenStreamKind {
206
- Empty ,
207
- Tree ( TokenTree ) ,
208
- JointTree ( TokenTree ) ,
209
- Stream ( Lrc < Vec < TokenStream > > ) ,
210
- }
211
-
212
205
impl From < TokenTree > for TokenStream {
213
206
fn from ( tt : TokenTree ) -> TokenStream {
214
- TokenStream { kind : TokenStreamKind :: Tree ( tt) }
207
+ TokenStream :: Tree ( tt)
215
208
}
216
209
}
217
210
@@ -230,22 +223,22 @@ impl<T: Into<TokenStream>> iter::FromIterator<T> for TokenStream {
230
223
impl Extend < TokenStream > for TokenStream {
231
224
fn extend < I : IntoIterator < Item = TokenStream > > ( & mut self , iter : I ) {
232
225
let iter = iter. into_iter ( ) ;
233
- let kind = mem:: replace ( & mut self . kind , TokenStreamKind :: Empty ) ;
226
+ let this = mem:: replace ( self , TokenStream :: Empty ) ;
234
227
235
228
// Vector of token streams originally in self.
236
- let tts: Vec < TokenStream > = match kind {
237
- TokenStreamKind :: Empty => {
229
+ let tts: Vec < TokenStream > = match this {
230
+ TokenStream :: Empty => {
238
231
let mut vec = Vec :: new ( ) ;
239
232
vec. reserve ( iter. size_hint ( ) . 0 ) ;
240
233
vec
241
234
}
242
- TokenStreamKind :: Tree ( _) | TokenStreamKind :: JointTree ( _) => {
235
+ TokenStream :: Tree ( _) | TokenStream :: JointTree ( _) => {
243
236
let mut vec = Vec :: new ( ) ;
244
237
vec. reserve ( 1 + iter. size_hint ( ) . 0 ) ;
245
- vec. push ( TokenStream { kind } ) ;
238
+ vec. push ( this ) ;
246
239
vec
247
240
}
248
- TokenStreamKind :: Stream ( rc_vec) => match Lrc :: try_unwrap ( rc_vec) {
241
+ TokenStream :: Stream ( rc_vec) => match Lrc :: try_unwrap ( rc_vec) {
249
242
Ok ( mut vec) => {
250
243
// Extend in place using the existing capacity if possible.
251
244
// This is the fast path for libraries like `quote` that
@@ -286,20 +279,20 @@ impl PartialEq<TokenStream> for TokenStream {
286
279
287
280
impl TokenStream {
288
281
pub fn len ( & self ) -> usize {
289
- if let TokenStreamKind :: Stream ( ref slice) = self . kind {
282
+ if let TokenStream :: Stream ( ref slice) = self {
290
283
slice. len ( )
291
284
} else {
292
285
0
293
286
}
294
287
}
295
288
296
289
pub fn empty ( ) -> TokenStream {
297
- TokenStream { kind : TokenStreamKind :: Empty }
290
+ TokenStream :: Empty
298
291
}
299
292
300
293
pub fn is_empty ( & self ) -> bool {
301
- match self . kind {
302
- TokenStreamKind :: Empty => true ,
294
+ match self {
295
+ TokenStream :: Empty => true ,
303
296
_ => false ,
304
297
}
305
298
}
@@ -313,7 +306,7 @@ impl TokenStream {
313
306
}
314
307
315
308
fn concat_rc_vec ( streams : Lrc < Vec < TokenStream > > ) -> TokenStream {
316
- TokenStream { kind : TokenStreamKind :: Stream ( streams) }
309
+ TokenStream :: Stream ( streams)
317
310
}
318
311
319
312
pub fn trees ( & self ) -> Cursor {
@@ -377,9 +370,9 @@ impl TokenStream {
377
370
/// Precondition: `self` consists of a single token tree.
378
371
/// Returns true if the token tree is a joint operation w.r.t. `proc_macro::TokenNode`.
379
372
pub fn as_tree ( self ) -> ( TokenTree , bool /* joint? */ ) {
380
- match self . kind {
381
- TokenStreamKind :: Tree ( tree) => ( tree, false ) ,
382
- TokenStreamKind :: JointTree ( tree) => ( tree, true ) ,
373
+ match self {
374
+ TokenStream :: Tree ( tree) => ( tree, false ) ,
375
+ TokenStream :: JointTree ( tree) => ( tree, true ) ,
383
376
_ => unreachable ! ( ) ,
384
377
}
385
378
}
@@ -389,9 +382,9 @@ impl TokenStream {
389
382
let mut result = Vec :: new ( ) ;
390
383
let mut i = 0 ;
391
384
while let Some ( stream) = trees. next_as_stream ( ) {
392
- result. push ( match stream. kind {
393
- TokenStreamKind :: Tree ( tree) => f ( i, tree) . into ( ) ,
394
- TokenStreamKind :: JointTree ( tree) => f ( i, tree) . joint ( ) ,
385
+ result. push ( match stream {
386
+ TokenStream :: Tree ( tree) => f ( i, tree) . into ( ) ,
387
+ TokenStream :: JointTree ( tree) => f ( i, tree) . joint ( ) ,
395
388
_ => unreachable ! ( )
396
389
} ) ;
397
390
i += 1 ;
@@ -403,29 +396,29 @@ impl TokenStream {
403
396
let mut trees = self . into_trees ( ) ;
404
397
let mut result = Vec :: new ( ) ;
405
398
while let Some ( stream) = trees. next_as_stream ( ) {
406
- result. push ( match stream. kind {
407
- TokenStreamKind :: Tree ( tree) => f ( tree) . into ( ) ,
408
- TokenStreamKind :: JointTree ( tree) => f ( tree) . joint ( ) ,
399
+ result. push ( match stream {
400
+ TokenStream :: Tree ( tree) => f ( tree) . into ( ) ,
401
+ TokenStream :: JointTree ( tree) => f ( tree) . joint ( ) ,
409
402
_ => unreachable ! ( )
410
403
} ) ;
411
404
}
412
405
TokenStream :: concat ( result)
413
406
}
414
407
415
408
fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , bool ) > {
416
- match self . kind {
417
- TokenStreamKind :: Empty => None ,
418
- TokenStreamKind :: Tree ( ref tree) => Some ( ( tree. clone ( ) , false ) ) ,
419
- TokenStreamKind :: JointTree ( ref tree) => Some ( ( tree. clone ( ) , true ) ) ,
420
- TokenStreamKind :: Stream ( ref stream) => stream. first ( ) . unwrap ( ) . first_tree_and_joint ( ) ,
409
+ match self {
410
+ TokenStream :: Empty => None ,
411
+ TokenStream :: Tree ( ref tree) => Some ( ( tree. clone ( ) , false ) ) ,
412
+ TokenStream :: JointTree ( ref tree) => Some ( ( tree. clone ( ) , true ) ) ,
413
+ TokenStream :: Stream ( ref stream) => stream. first ( ) . unwrap ( ) . first_tree_and_joint ( ) ,
421
414
}
422
415
}
423
416
424
417
fn last_tree_if_joint ( & self ) -> Option < TokenTree > {
425
- match self . kind {
426
- TokenStreamKind :: Empty | TokenStreamKind :: Tree ( ..) => None ,
427
- TokenStreamKind :: JointTree ( ref tree) => Some ( tree. clone ( ) ) ,
428
- TokenStreamKind :: Stream ( ref stream) => stream. last ( ) . unwrap ( ) . last_tree_if_joint ( ) ,
418
+ match self {
419
+ TokenStream :: Empty | TokenStream :: Tree ( ..) => None ,
420
+ TokenStream :: JointTree ( ref tree) => Some ( tree. clone ( ) ) ,
421
+ TokenStream :: Stream ( ref stream) => stream. last ( ) . unwrap ( ) . last_tree_if_joint ( ) ,
429
422
}
430
423
}
431
424
}
@@ -472,7 +465,7 @@ impl TokenStreamBuilder {
472
465
}
473
466
474
467
fn push_all_but_last_tree ( & mut self , stream : & TokenStream ) {
475
- if let TokenStreamKind :: Stream ( ref streams) = stream. kind {
468
+ if let TokenStream :: Stream ( ref streams) = stream {
476
469
let len = streams. len ( ) ;
477
470
match len {
478
471
1 => { }
@@ -484,7 +477,7 @@ impl TokenStreamBuilder {
484
477
}
485
478
486
479
fn push_all_but_first_tree ( & mut self , stream : & TokenStream ) {
487
- if let TokenStreamKind :: Stream ( ref streams) = stream. kind {
480
+ if let TokenStream :: Stream ( ref streams) = stream {
488
481
let len = streams. len ( ) ;
489
482
match len {
490
483
1 => { }
@@ -524,10 +517,10 @@ impl StreamCursor {
524
517
if self . index < self . stream . len ( ) {
525
518
self . index += 1 ;
526
519
let next = self . stream [ self . index - 1 ] . clone ( ) ;
527
- match next. kind {
528
- TokenStreamKind :: Tree ( ..) | TokenStreamKind :: JointTree ( ..) => return Some ( next) ,
529
- TokenStreamKind :: Stream ( stream) => self . insert ( stream) ,
530
- TokenStreamKind :: Empty => { }
520
+ match next {
521
+ TokenStream :: Tree ( ..) | TokenStream :: JointTree ( ..) => return Some ( next) ,
522
+ TokenStream :: Stream ( stream) => self . insert ( stream) ,
523
+ TokenStream :: Empty => { }
531
524
}
532
525
} else if let Some ( ( stream, index) ) = self . stack . pop ( ) {
533
526
self . stream = stream;
@@ -548,20 +541,20 @@ impl Iterator for Cursor {
548
541
type Item = TokenTree ;
549
542
550
543
fn next ( & mut self ) -> Option < TokenTree > {
551
- self . next_as_stream ( ) . map ( |stream| match stream. kind {
552
- TokenStreamKind :: Tree ( tree) | TokenStreamKind :: JointTree ( tree) => tree,
544
+ self . next_as_stream ( ) . map ( |stream| match stream {
545
+ TokenStream :: Tree ( tree) | TokenStream :: JointTree ( tree) => tree,
553
546
_ => unreachable ! ( )
554
547
} )
555
548
}
556
549
}
557
550
558
551
impl Cursor {
559
552
fn new ( stream : TokenStream ) -> Self {
560
- Cursor ( match stream. kind {
561
- TokenStreamKind :: Empty => CursorKind :: Empty ,
562
- TokenStreamKind :: Tree ( tree) => CursorKind :: Tree ( tree, false ) ,
563
- TokenStreamKind :: JointTree ( tree) => CursorKind :: JointTree ( tree, false ) ,
564
- TokenStreamKind :: Stream ( stream) => CursorKind :: Stream ( StreamCursor :: new ( stream) ) ,
553
+ Cursor ( match stream {
554
+ TokenStream :: Empty => CursorKind :: Empty ,
555
+ TokenStream :: Tree ( tree) => CursorKind :: Tree ( tree, false ) ,
556
+ TokenStream :: JointTree ( tree) => CursorKind :: JointTree ( tree, false ) ,
557
+ TokenStream :: Stream ( stream) => CursorKind :: Stream ( StreamCursor :: new ( stream) ) ,
565
558
} )
566
559
}
567
560
@@ -610,11 +603,11 @@ impl Cursor {
610
603
pub fn look_ahead ( & self , n : usize ) -> Option < TokenTree > {
611
604
fn look_ahead ( streams : & [ TokenStream ] , mut n : usize ) -> Result < TokenTree , usize > {
612
605
for stream in streams {
613
- n = match stream. kind {
614
- TokenStreamKind :: Tree ( ref tree) | TokenStreamKind :: JointTree ( ref tree)
606
+ n = match stream {
607
+ TokenStream :: Tree ( ref tree) | TokenStream :: JointTree ( ref tree)
615
608
if n == 0 => return Ok ( tree. clone ( ) ) ,
616
- TokenStreamKind :: Tree ( ..) | TokenStreamKind :: JointTree ( ..) => n - 1 ,
617
- TokenStreamKind :: Stream ( ref stream) => match look_ahead ( stream, n) {
609
+ TokenStream :: Tree ( ..) | TokenStream :: JointTree ( ..) => n - 1 ,
610
+ TokenStream :: Stream ( ref stream) => match look_ahead ( stream, n) {
618
611
Ok ( tree) => return Ok ( tree) ,
619
612
Err ( n) => n,
620
613
} ,
@@ -660,11 +653,11 @@ impl ThinTokenStream {
660
653
661
654
impl From < TokenStream > for ThinTokenStream {
662
655
fn from ( stream : TokenStream ) -> ThinTokenStream {
663
- ThinTokenStream ( match stream. kind {
664
- TokenStreamKind :: Empty => None ,
665
- TokenStreamKind :: Tree ( tree) => Some ( Lrc :: new ( vec ! [ tree. into( ) ] ) ) ,
666
- TokenStreamKind :: JointTree ( tree) => Some ( Lrc :: new ( vec ! [ tree. joint( ) ] ) ) ,
667
- TokenStreamKind :: Stream ( stream) => Some ( stream) ,
656
+ ThinTokenStream ( match stream {
657
+ TokenStream :: Empty => None ,
658
+ TokenStream :: Tree ( tree) => Some ( Lrc :: new ( vec ! [ tree. into( ) ] ) ) ,
659
+ TokenStream :: JointTree ( tree) => Some ( Lrc :: new ( vec ! [ tree. joint( ) ] ) ) ,
660
+ TokenStream :: Stream ( stream) => Some ( stream) ,
668
661
} )
669
662
}
670
663
}
0 commit comments