@@ -123,7 +123,7 @@ impl TokenTree {
123
123
}
124
124
125
125
pub fn joint ( self ) -> TokenStream {
126
- TokenStream :: JointTree ( self )
126
+ TokenStream :: Tree ( self , Joint )
127
127
}
128
128
129
129
/// Returns the opening delimiter as a token tree.
@@ -156,15 +156,22 @@ impl TokenTree {
156
156
#[ derive( Clone , Debug ) ]
157
157
pub enum TokenStream {
158
158
Empty ,
159
- Tree ( TokenTree ) ,
160
- JointTree ( TokenTree ) ,
159
+ Tree ( TokenTree , IsJoint ) ,
161
160
Stream ( Lrc < Vec < TokenStream > > ) ,
162
161
}
163
162
164
163
// `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger.
165
164
#[ cfg( target_arch = "x86_64" ) ]
166
165
static_assert ! ( MEM_SIZE_OF_TOKEN_STREAM : mem:: size_of:: <TokenStream >( ) == 32 ) ;
167
166
167
+ #[ derive( Clone , Copy , Debug , PartialEq ) ]
168
+ pub enum IsJoint {
169
+ Joint ,
170
+ NonJoint
171
+ }
172
+
173
+ use self :: IsJoint :: * ;
174
+
168
175
impl TokenStream {
169
176
/// Given a `TokenStream` with a `Stream` of only two arguments, return a new `TokenStream`
170
177
/// separating the two arguments with a comma for diagnostic suggestions.
@@ -176,16 +183,16 @@ impl TokenStream {
176
183
while let Some ( ( pos, ts) ) = iter. next ( ) {
177
184
if let Some ( ( _, next) ) = iter. peek ( ) {
178
185
let sp = match ( & ts, & next) {
179
- ( TokenStream :: Tree ( TokenTree :: Token ( _, token:: Token :: Comma ) ) , _) |
180
- ( _, TokenStream :: Tree ( TokenTree :: Token ( _, token:: Token :: Comma ) ) ) => {
181
- continue ;
182
- }
183
- ( TokenStream :: Tree ( TokenTree :: Token ( sp, _ ) ) , _) => * sp ,
184
- ( TokenStream :: Tree ( TokenTree :: Delimited ( sp , .. ) ) , _ ) => sp. entire ( ) ,
186
+ ( TokenStream :: Tree ( TokenTree :: Token ( _, token:: Token :: Comma ) , NonJoint ) , _) |
187
+ ( _, TokenStream :: Tree ( TokenTree :: Token ( _, token:: Token :: Comma ) , NonJoint ) )
188
+ => continue ,
189
+ ( TokenStream :: Tree ( TokenTree :: Token ( sp , _ ) , NonJoint ) , _ ) => * sp ,
190
+ ( TokenStream :: Tree ( TokenTree :: Delimited ( sp, .. ) , NonJoint ) , _) =>
191
+ sp. entire ( ) ,
185
192
_ => continue ,
186
193
} ;
187
194
let sp = sp. shrink_to_hi ( ) ;
188
- let comma = TokenStream :: Tree ( TokenTree :: Token ( sp, token:: Comma ) ) ;
195
+ let comma = TokenStream :: Tree ( TokenTree :: Token ( sp, token:: Comma ) , NonJoint ) ;
189
196
suggestion = Some ( ( pos, comma, sp) ) ;
190
197
}
191
198
}
@@ -204,7 +211,7 @@ impl TokenStream {
204
211
205
212
impl From < TokenTree > for TokenStream {
206
213
fn from ( tt : TokenTree ) -> TokenStream {
207
- TokenStream :: Tree ( tt)
214
+ TokenStream :: Tree ( tt, NonJoint )
208
215
}
209
216
}
210
217
@@ -232,7 +239,7 @@ impl Extend<TokenStream> for TokenStream {
232
239
vec. reserve ( iter. size_hint ( ) . 0 ) ;
233
240
vec
234
241
}
235
- TokenStream :: Tree ( _ ) | TokenStream :: JointTree ( _ ) => {
242
+ TokenStream :: Tree ( .. ) => {
236
243
let mut vec = Vec :: new ( ) ;
237
244
vec. reserve ( 1 + iter. size_hint ( ) . 0 ) ;
238
245
vec. push ( this) ;
@@ -367,8 +374,7 @@ impl TokenStream {
367
374
/// Returns true if the token tree is a joint operation w.r.t. `proc_macro::TokenNode`.
368
375
pub fn as_tree ( self ) -> ( TokenTree , bool /* joint? */ ) {
369
376
match self {
370
- TokenStream :: Tree ( tree) => ( tree, false ) ,
371
- TokenStream :: JointTree ( tree) => ( tree, true ) ,
377
+ TokenStream :: Tree ( tree, is_joint) => ( tree, is_joint == Joint ) ,
372
378
_ => unreachable ! ( ) ,
373
379
}
374
380
}
@@ -379,8 +385,7 @@ impl TokenStream {
379
385
let mut i = 0 ;
380
386
while let Some ( stream) = trees. next_as_stream ( ) {
381
387
result. push ( match stream {
382
- TokenStream :: Tree ( tree) => f ( i, tree) . into ( ) ,
383
- TokenStream :: JointTree ( tree) => f ( i, tree) . joint ( ) ,
388
+ TokenStream :: Tree ( tree, is_joint) => TokenStream :: Tree ( f ( i, tree) , is_joint) ,
384
389
_ => unreachable ! ( )
385
390
} ) ;
386
391
i += 1 ;
@@ -393,27 +398,25 @@ impl TokenStream {
393
398
let mut result = Vec :: new ( ) ;
394
399
while let Some ( stream) = trees. next_as_stream ( ) {
395
400
result. push ( match stream {
396
- TokenStream :: Tree ( tree) => f ( tree) . into ( ) ,
397
- TokenStream :: JointTree ( tree) => f ( tree) . joint ( ) ,
401
+ TokenStream :: Tree ( tree, is_joint) => TokenStream :: Tree ( f ( tree) , is_joint) ,
398
402
_ => unreachable ! ( )
399
403
} ) ;
400
404
}
401
405
TokenStream :: new ( result)
402
406
}
403
407
404
- fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , bool ) > {
408
+ fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , IsJoint ) > {
405
409
match self {
406
410
TokenStream :: Empty => None ,
407
- TokenStream :: Tree ( ref tree) => Some ( ( tree. clone ( ) , false ) ) ,
408
- TokenStream :: JointTree ( ref tree) => Some ( ( tree. clone ( ) , true ) ) ,
411
+ TokenStream :: Tree ( ref tree, is_joint) => Some ( ( tree. clone ( ) , * is_joint) ) ,
409
412
TokenStream :: Stream ( ref stream) => stream. first ( ) . unwrap ( ) . first_tree_and_joint ( ) ,
410
413
}
411
414
}
412
415
413
416
fn last_tree_if_joint ( & self ) -> Option < TokenTree > {
414
417
match self {
415
- TokenStream :: Empty | TokenStream :: Tree ( .. ) => None ,
416
- TokenStream :: JointTree ( ref tree) => Some ( tree. clone ( ) ) ,
418
+ TokenStream :: Empty | TokenStream :: Tree ( _ , NonJoint ) => None ,
419
+ TokenStream :: Tree ( ref tree, Joint ) => Some ( tree. clone ( ) ) ,
417
420
TokenStream :: Stream ( ref stream) => stream. last ( ) . unwrap ( ) . last_tree_if_joint ( ) ,
418
421
}
419
422
}
@@ -437,11 +440,7 @@ impl TokenStreamBuilder {
437
440
self . push_all_but_last_tree ( & last_stream) ;
438
441
let glued_span = last_span. to ( span) ;
439
442
let glued_tt = TokenTree :: Token ( glued_span, glued_tok) ;
440
- let glued_tokenstream = if is_joint {
441
- glued_tt. joint ( )
442
- } else {
443
- glued_tt. into ( )
444
- } ;
443
+ let glued_tokenstream = TokenStream :: Tree ( glued_tt, is_joint) ;
445
444
self . 0 . push ( glued_tokenstream) ;
446
445
self . push_all_but_first_tree ( & stream) ;
447
446
return
@@ -491,8 +490,7 @@ pub struct Cursor(CursorKind);
491
490
#[ derive( Clone ) ]
492
491
enum CursorKind {
493
492
Empty ,
494
- Tree ( TokenTree , bool /* consumed? */ ) ,
495
- JointTree ( TokenTree , bool /* consumed? */ ) ,
493
+ Tree ( TokenTree , IsJoint , bool /* consumed? */ ) ,
496
494
Stream ( StreamCursor ) ,
497
495
}
498
496
@@ -514,9 +512,9 @@ impl StreamCursor {
514
512
self . index += 1 ;
515
513
let next = self . stream [ self . index - 1 ] . clone ( ) ;
516
514
match next {
517
- TokenStream :: Tree ( ..) | TokenStream :: JointTree ( ..) => return Some ( next) ,
518
- TokenStream :: Stream ( stream) => self . insert ( stream) ,
519
515
TokenStream :: Empty => { }
516
+ TokenStream :: Tree ( ..) => return Some ( next) ,
517
+ TokenStream :: Stream ( stream) => self . insert ( stream) ,
520
518
}
521
519
} else if let Some ( ( stream, index) ) = self . stack . pop ( ) {
522
520
self . stream = stream;
@@ -538,7 +536,7 @@ impl Iterator for Cursor {
538
536
539
537
fn next ( & mut self ) -> Option < TokenTree > {
540
538
self . next_as_stream ( ) . map ( |stream| match stream {
541
- TokenStream :: Tree ( tree) | TokenStream :: JointTree ( tree ) => tree,
539
+ TokenStream :: Tree ( tree, _ ) => tree,
542
540
_ => unreachable ! ( )
543
541
} )
544
542
}
@@ -548,18 +546,15 @@ impl Cursor {
548
546
fn new ( stream : TokenStream ) -> Self {
549
547
Cursor ( match stream {
550
548
TokenStream :: Empty => CursorKind :: Empty ,
551
- TokenStream :: Tree ( tree) => CursorKind :: Tree ( tree, false ) ,
552
- TokenStream :: JointTree ( tree) => CursorKind :: JointTree ( tree, false ) ,
549
+ TokenStream :: Tree ( tree, is_joint) => CursorKind :: Tree ( tree, is_joint, false ) ,
553
550
TokenStream :: Stream ( stream) => CursorKind :: Stream ( StreamCursor :: new ( stream) ) ,
554
551
} )
555
552
}
556
553
557
554
pub fn next_as_stream ( & mut self ) -> Option < TokenStream > {
558
555
let ( stream, consumed) = match self . 0 {
559
- CursorKind :: Tree ( ref tree, ref mut consumed @ false ) =>
560
- ( tree. clone ( ) . into ( ) , consumed) ,
561
- CursorKind :: JointTree ( ref tree, ref mut consumed @ false ) =>
562
- ( tree. clone ( ) . joint ( ) , consumed) ,
556
+ CursorKind :: Tree ( ref tree, ref is_joint, ref mut consumed @ false ) =>
557
+ ( TokenStream :: Tree ( tree. clone ( ) , * is_joint) , consumed) ,
563
558
CursorKind :: Stream ( ref mut cursor) => return cursor. next_as_stream ( ) ,
564
559
_ => return None ,
565
560
} ;
@@ -572,7 +567,7 @@ impl Cursor {
572
567
match self . 0 {
573
568
_ if stream. is_empty ( ) => return ,
574
569
CursorKind :: Empty => * self = stream. trees ( ) ,
575
- CursorKind :: Tree ( _, consumed ) | CursorKind :: JointTree ( _, consumed) => {
570
+ CursorKind :: Tree ( _, _, consumed) => {
576
571
* self = TokenStream :: new ( vec ! [ self . original_stream( ) , stream] ) . trees ( ) ;
577
572
if consumed {
578
573
self . next ( ) ;
@@ -587,8 +582,8 @@ impl Cursor {
587
582
pub fn original_stream ( & self ) -> TokenStream {
588
583
match self . 0 {
589
584
CursorKind :: Empty => TokenStream :: empty ( ) ,
590
- CursorKind :: Tree ( ref tree, _) => tree . clone ( ) . into ( ) ,
591
- CursorKind :: JointTree ( ref tree , _ ) => tree. clone ( ) . joint ( ) ,
585
+ CursorKind :: Tree ( ref tree, ref is_joint , _) =>
586
+ TokenStream :: Tree ( tree. clone ( ) , * is_joint ) ,
592
587
CursorKind :: Stream ( ref cursor) => TokenStream :: Stream (
593
588
cursor. stack . get ( 0 ) . cloned ( ) . map ( |( stream, _) | stream)
594
589
. unwrap_or_else ( || cursor. stream . clone ( ) )
@@ -600,9 +595,8 @@ impl Cursor {
600
595
fn look_ahead ( streams : & [ TokenStream ] , mut n : usize ) -> Result < TokenTree , usize > {
601
596
for stream in streams {
602
597
n = match stream {
603
- TokenStream :: Tree ( ref tree) | TokenStream :: JointTree ( ref tree)
604
- if n == 0 => return Ok ( tree. clone ( ) ) ,
605
- TokenStream :: Tree ( ..) | TokenStream :: JointTree ( ..) => n - 1 ,
598
+ TokenStream :: Tree ( ref tree, _) if n == 0 => return Ok ( tree. clone ( ) ) ,
599
+ TokenStream :: Tree ( ..) => n - 1 ,
606
600
TokenStream :: Stream ( ref stream) => match look_ahead ( stream, n) {
607
601
Ok ( tree) => return Ok ( tree) ,
608
602
Err ( n) => n,
@@ -615,10 +609,8 @@ impl Cursor {
615
609
616
610
match self . 0 {
617
611
CursorKind :: Empty |
618
- CursorKind :: Tree ( _, true ) |
619
- CursorKind :: JointTree ( _, true ) => Err ( n) ,
620
- CursorKind :: Tree ( ref tree, false ) |
621
- CursorKind :: JointTree ( ref tree, false ) => look_ahead ( & [ tree. clone ( ) . into ( ) ] , n) ,
612
+ CursorKind :: Tree ( _, _, true ) => Err ( n) ,
613
+ CursorKind :: Tree ( ref tree, _, false ) => look_ahead ( & [ tree. clone ( ) . into ( ) ] , n) ,
622
614
CursorKind :: Stream ( ref cursor) => {
623
615
look_ahead ( & cursor. stream [ cursor. index ..] , n) . or_else ( |mut n| {
624
616
for & ( ref stream, index) in cursor. stack . iter ( ) . rev ( ) {
@@ -651,8 +643,7 @@ impl From<TokenStream> for ThinTokenStream {
651
643
fn from ( stream : TokenStream ) -> ThinTokenStream {
652
644
ThinTokenStream ( match stream {
653
645
TokenStream :: Empty => None ,
654
- TokenStream :: Tree ( tree) => Some ( Lrc :: new ( vec ! [ tree. into( ) ] ) ) ,
655
- TokenStream :: JointTree ( tree) => Some ( Lrc :: new ( vec ! [ tree. joint( ) ] ) ) ,
646
+ TokenStream :: Tree ( ..) => Some ( Lrc :: new ( vec ! [ stream] ) ) ,
656
647
TokenStream :: Stream ( stream) => Some ( stream) ,
657
648
} )
658
649
}
0 commit comments