@@ -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) ;
@@ -369,8 +376,7 @@ impl TokenStream {
369
376
/// Returns true if the token tree is a joint operation w.r.t. `proc_macro::TokenNode`.
370
377
pub fn as_tree ( self ) -> ( TokenTree , bool /* joint? */ ) {
371
378
match self {
372
- TokenStream :: Tree ( tree) => ( tree, false ) ,
373
- TokenStream :: JointTree ( tree) => ( tree, true ) ,
379
+ TokenStream :: Tree ( tree, is_joint) => ( tree, is_joint == Joint ) ,
374
380
_ => unreachable ! ( ) ,
375
381
}
376
382
}
@@ -381,8 +387,7 @@ impl TokenStream {
381
387
let mut i = 0 ;
382
388
while let Some ( stream) = trees. next_as_stream ( ) {
383
389
result. push ( match stream {
384
- TokenStream :: Tree ( tree) => f ( i, tree) . into ( ) ,
385
- TokenStream :: JointTree ( tree) => f ( i, tree) . joint ( ) ,
390
+ TokenStream :: Tree ( tree, is_joint) => TokenStream :: Tree ( f ( i, tree) , is_joint) ,
386
391
_ => unreachable ! ( )
387
392
} ) ;
388
393
i += 1 ;
@@ -395,27 +400,25 @@ impl TokenStream {
395
400
let mut result = Vec :: new ( ) ;
396
401
while let Some ( stream) = trees. next_as_stream ( ) {
397
402
result. push ( match stream {
398
- TokenStream :: Tree ( tree) => f ( tree) . into ( ) ,
399
- TokenStream :: JointTree ( tree) => f ( tree) . joint ( ) ,
403
+ TokenStream :: Tree ( tree, is_joint) => TokenStream :: Tree ( f ( tree) , is_joint) ,
400
404
_ => unreachable ! ( )
401
405
} ) ;
402
406
}
403
407
TokenStream :: new ( result)
404
408
}
405
409
406
- fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , bool ) > {
410
+ fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , IsJoint ) > {
407
411
match self {
408
412
TokenStream :: Empty => None ,
409
- TokenStream :: Tree ( ref tree) => Some ( ( tree. clone ( ) , false ) ) ,
410
- TokenStream :: JointTree ( ref tree) => Some ( ( tree. clone ( ) , true ) ) ,
413
+ TokenStream :: Tree ( ref tree, is_joint) => Some ( ( tree. clone ( ) , * is_joint) ) ,
411
414
TokenStream :: Stream ( ref stream) => stream. first ( ) . unwrap ( ) . first_tree_and_joint ( ) ,
412
415
}
413
416
}
414
417
415
418
fn last_tree_if_joint ( & self ) -> Option < TokenTree > {
416
419
match self {
417
- TokenStream :: Empty | TokenStream :: Tree ( .. ) => None ,
418
- TokenStream :: JointTree ( ref tree) => Some ( tree. clone ( ) ) ,
420
+ TokenStream :: Empty | TokenStream :: Tree ( _ , NonJoint ) => None ,
421
+ TokenStream :: Tree ( ref tree, Joint ) => Some ( tree. clone ( ) ) ,
419
422
TokenStream :: Stream ( ref stream) => stream. last ( ) . unwrap ( ) . last_tree_if_joint ( ) ,
420
423
}
421
424
}
@@ -439,11 +442,7 @@ impl TokenStreamBuilder {
439
442
self . push_all_but_last_tree ( & last_stream) ;
440
443
let glued_span = last_span. to ( span) ;
441
444
let glued_tt = TokenTree :: Token ( glued_span, glued_tok) ;
442
- let glued_tokenstream = if is_joint {
443
- glued_tt. joint ( )
444
- } else {
445
- glued_tt. into ( )
446
- } ;
445
+ let glued_tokenstream = TokenStream :: Tree ( glued_tt, is_joint) ;
447
446
self . 0 . push ( glued_tokenstream) ;
448
447
self . push_all_but_first_tree ( & stream) ;
449
448
return
@@ -493,8 +492,7 @@ pub struct Cursor(CursorKind);
493
492
#[ derive( Clone ) ]
494
493
enum CursorKind {
495
494
Empty ,
496
- Tree ( TokenTree , bool /* consumed? */ ) ,
497
- JointTree ( TokenTree , bool /* consumed? */ ) ,
495
+ Tree ( TokenTree , IsJoint , bool /* consumed? */ ) ,
498
496
Stream ( StreamCursor ) ,
499
497
}
500
498
@@ -516,9 +514,9 @@ impl StreamCursor {
516
514
self . index += 1 ;
517
515
let next = self . stream [ self . index - 1 ] . clone ( ) ;
518
516
match next {
519
- TokenStream :: Tree ( ..) | TokenStream :: JointTree ( ..) => return Some ( next) ,
520
- TokenStream :: Stream ( stream) => self . insert ( stream) ,
521
517
TokenStream :: Empty => { }
518
+ TokenStream :: Tree ( ..) => return Some ( next) ,
519
+ TokenStream :: Stream ( stream) => self . insert ( stream) ,
522
520
}
523
521
} else if let Some ( ( stream, index) ) = self . stack . pop ( ) {
524
522
self . stream = stream;
@@ -540,7 +538,7 @@ impl Iterator for Cursor {
540
538
541
539
fn next ( & mut self ) -> Option < TokenTree > {
542
540
self . next_as_stream ( ) . map ( |stream| match stream {
543
- TokenStream :: Tree ( tree) | TokenStream :: JointTree ( tree ) => tree,
541
+ TokenStream :: Tree ( tree, _ ) => tree,
544
542
_ => unreachable ! ( )
545
543
} )
546
544
}
@@ -550,18 +548,15 @@ impl Cursor {
550
548
fn new ( stream : TokenStream ) -> Self {
551
549
Cursor ( match stream {
552
550
TokenStream :: Empty => CursorKind :: Empty ,
553
- TokenStream :: Tree ( tree) => CursorKind :: Tree ( tree, false ) ,
554
- TokenStream :: JointTree ( tree) => CursorKind :: JointTree ( tree, false ) ,
551
+ TokenStream :: Tree ( tree, is_joint) => CursorKind :: Tree ( tree, is_joint, false ) ,
555
552
TokenStream :: Stream ( stream) => CursorKind :: Stream ( StreamCursor :: new ( stream) ) ,
556
553
} )
557
554
}
558
555
559
556
pub fn next_as_stream ( & mut self ) -> Option < TokenStream > {
560
557
let ( stream, consumed) = match self . 0 {
561
- CursorKind :: Tree ( ref tree, ref mut consumed @ false ) =>
562
- ( tree. clone ( ) . into ( ) , consumed) ,
563
- CursorKind :: JointTree ( ref tree, ref mut consumed @ false ) =>
564
- ( tree. clone ( ) . joint ( ) , consumed) ,
558
+ CursorKind :: Tree ( ref tree, ref is_joint, ref mut consumed @ false ) =>
559
+ ( TokenStream :: Tree ( tree. clone ( ) , * is_joint) , consumed) ,
565
560
CursorKind :: Stream ( ref mut cursor) => return cursor. next_as_stream ( ) ,
566
561
_ => return None ,
567
562
} ;
@@ -574,7 +569,7 @@ impl Cursor {
574
569
match self . 0 {
575
570
_ if stream. is_empty ( ) => return ,
576
571
CursorKind :: Empty => * self = stream. trees ( ) ,
577
- CursorKind :: Tree ( _, consumed ) | CursorKind :: JointTree ( _, consumed) => {
572
+ CursorKind :: Tree ( _, _, consumed) => {
578
573
* self = TokenStream :: new ( vec ! [ self . original_stream( ) , stream] ) . trees ( ) ;
579
574
if consumed {
580
575
self . next ( ) ;
@@ -589,8 +584,8 @@ impl Cursor {
589
584
pub fn original_stream ( & self ) -> TokenStream {
590
585
match self . 0 {
591
586
CursorKind :: Empty => TokenStream :: empty ( ) ,
592
- CursorKind :: Tree ( ref tree, _) => tree . clone ( ) . into ( ) ,
593
- CursorKind :: JointTree ( ref tree , _ ) => tree. clone ( ) . joint ( ) ,
587
+ CursorKind :: Tree ( ref tree, ref is_joint , _) =>
588
+ TokenStream :: Tree ( tree. clone ( ) , * is_joint ) ,
594
589
CursorKind :: Stream ( ref cursor) => TokenStream :: Stream (
595
590
cursor. stack . get ( 0 ) . cloned ( ) . map ( |( stream, _) | stream)
596
591
. unwrap_or_else ( || cursor. stream . clone ( ) )
@@ -602,9 +597,8 @@ impl Cursor {
602
597
fn look_ahead ( streams : & [ TokenStream ] , mut n : usize ) -> Result < TokenTree , usize > {
603
598
for stream in streams {
604
599
n = match stream {
605
- TokenStream :: Tree ( ref tree) | TokenStream :: JointTree ( ref tree)
606
- if n == 0 => return Ok ( tree. clone ( ) ) ,
607
- TokenStream :: Tree ( ..) | TokenStream :: JointTree ( ..) => n - 1 ,
600
+ TokenStream :: Tree ( ref tree, _) if n == 0 => return Ok ( tree. clone ( ) ) ,
601
+ TokenStream :: Tree ( ..) => n - 1 ,
608
602
TokenStream :: Stream ( ref stream) => match look_ahead ( stream, n) {
609
603
Ok ( tree) => return Ok ( tree) ,
610
604
Err ( n) => n,
@@ -617,10 +611,8 @@ impl Cursor {
617
611
618
612
match self . 0 {
619
613
CursorKind :: Empty |
620
- CursorKind :: Tree ( _, true ) |
621
- CursorKind :: JointTree ( _, true ) => Err ( n) ,
622
- CursorKind :: Tree ( ref tree, false ) |
623
- CursorKind :: JointTree ( ref tree, false ) => look_ahead ( & [ tree. clone ( ) . into ( ) ] , n) ,
614
+ CursorKind :: Tree ( _, _, true ) => Err ( n) ,
615
+ CursorKind :: Tree ( ref tree, _, false ) => look_ahead ( & [ tree. clone ( ) . into ( ) ] , n) ,
624
616
CursorKind :: Stream ( ref cursor) => {
625
617
look_ahead ( & cursor. stream [ cursor. index ..] , n) . or_else ( |mut n| {
626
618
for & ( ref stream, index) in cursor. stack . iter ( ) . rev ( ) {
@@ -653,8 +645,7 @@ impl From<TokenStream> for ThinTokenStream {
653
645
fn from ( stream : TokenStream ) -> ThinTokenStream {
654
646
ThinTokenStream ( match stream {
655
647
TokenStream :: Empty => None ,
656
- TokenStream :: Tree ( tree) => Some ( Lrc :: new ( vec ! [ tree. into( ) ] ) ) ,
657
- TokenStream :: JointTree ( tree) => Some ( Lrc :: new ( vec ! [ tree. joint( ) ] ) ) ,
648
+ TokenStream :: Tree ( ..) => Some ( Lrc :: new ( vec ! [ stream] ) ) ,
658
649
TokenStream :: Stream ( stream) => Some ( stream) ,
659
650
} )
660
651
}
0 commit comments