@@ -123,7 +123,7 @@ impl TokenTree {
123123 }
124124
125125 pub fn joint ( self ) -> TokenStream {
126- TokenStream :: JointTree ( self )
126+ TokenStream :: Tree ( self , Joint )
127127 }
128128
129129 /// Returns the opening delimiter as a token tree.
@@ -156,15 +156,22 @@ impl TokenTree {
156156#[ derive( Clone , Debug ) ]
157157pub enum TokenStream {
158158 Empty ,
159- Tree ( TokenTree ) ,
160- JointTree ( TokenTree ) ,
159+ Tree ( TokenTree , IsJoint ) ,
161160 Stream ( Lrc < Vec < TokenStream > > ) ,
162161}
163162
164163// `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger.
165164#[ cfg( target_arch = "x86_64" ) ]
166165static_assert ! ( MEM_SIZE_OF_TOKEN_STREAM : mem:: size_of:: <TokenStream >( ) == 32 ) ;
167166
167+ #[ derive( Clone , Copy , Debug , PartialEq ) ]
168+ pub enum IsJoint {
169+ Joint ,
170+ NonJoint
171+ }
172+
173+ use self :: IsJoint :: * ;
174+
168175impl TokenStream {
169176 /// Given a `TokenStream` with a `Stream` of only two arguments, return a new `TokenStream`
170177 /// separating the two arguments with a comma for diagnostic suggestions.
@@ -176,16 +183,16 @@ impl TokenStream {
176183 while let Some ( ( pos, ts) ) = iter. next ( ) {
177184 if let Some ( ( _, next) ) = iter. peek ( ) {
178185 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 ( ) ,
185192 _ => continue ,
186193 } ;
187194 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 ) ;
189196 suggestion = Some ( ( pos, comma, sp) ) ;
190197 }
191198 }
@@ -204,7 +211,7 @@ impl TokenStream {
204211
205212impl From < TokenTree > for TokenStream {
206213 fn from ( tt : TokenTree ) -> TokenStream {
207- TokenStream :: Tree ( tt)
214+ TokenStream :: Tree ( tt, NonJoint )
208215 }
209216}
210217
@@ -232,7 +239,7 @@ impl Extend<TokenStream> for TokenStream {
232239 vec. reserve ( iter. size_hint ( ) . 0 ) ;
233240 vec
234241 }
235- TokenStream :: Tree ( _ ) | TokenStream :: JointTree ( _ ) => {
242+ TokenStream :: Tree ( .. ) => {
236243 let mut vec = Vec :: new ( ) ;
237244 vec. reserve ( 1 + iter. size_hint ( ) . 0 ) ;
238245 vec. push ( this) ;
@@ -369,8 +376,7 @@ impl TokenStream {
369376 /// Returns true if the token tree is a joint operation w.r.t. `proc_macro::TokenNode`.
370377 pub fn as_tree ( self ) -> ( TokenTree , bool /* joint? */ ) {
371378 match self {
372- TokenStream :: Tree ( tree) => ( tree, false ) ,
373- TokenStream :: JointTree ( tree) => ( tree, true ) ,
379+ TokenStream :: Tree ( tree, is_joint) => ( tree, is_joint == Joint ) ,
374380 _ => unreachable ! ( ) ,
375381 }
376382 }
@@ -381,8 +387,7 @@ impl TokenStream {
381387 let mut i = 0 ;
382388 while let Some ( stream) = trees. next_as_stream ( ) {
383389 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) ,
386391 _ => unreachable ! ( )
387392 } ) ;
388393 i += 1 ;
@@ -395,27 +400,25 @@ impl TokenStream {
395400 let mut result = Vec :: new ( ) ;
396401 while let Some ( stream) = trees. next_as_stream ( ) {
397402 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) ,
400404 _ => unreachable ! ( )
401405 } ) ;
402406 }
403407 TokenStream :: new ( result)
404408 }
405409
406- fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , bool ) > {
410+ fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , IsJoint ) > {
407411 match self {
408412 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) ) ,
411414 TokenStream :: Stream ( ref stream) => stream. first ( ) . unwrap ( ) . first_tree_and_joint ( ) ,
412415 }
413416 }
414417
415418 fn last_tree_if_joint ( & self ) -> Option < TokenTree > {
416419 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 ( ) ) ,
419422 TokenStream :: Stream ( ref stream) => stream. last ( ) . unwrap ( ) . last_tree_if_joint ( ) ,
420423 }
421424 }
@@ -439,11 +442,7 @@ impl TokenStreamBuilder {
439442 self . push_all_but_last_tree ( & last_stream) ;
440443 let glued_span = last_span. to ( span) ;
441444 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) ;
447446 self . 0 . push ( glued_tokenstream) ;
448447 self . push_all_but_first_tree ( & stream) ;
449448 return
@@ -493,8 +492,7 @@ pub struct Cursor(CursorKind);
493492#[ derive( Clone ) ]
494493enum CursorKind {
495494 Empty ,
496- Tree ( TokenTree , bool /* consumed? */ ) ,
497- JointTree ( TokenTree , bool /* consumed? */ ) ,
495+ Tree ( TokenTree , IsJoint , bool /* consumed? */ ) ,
498496 Stream ( StreamCursor ) ,
499497}
500498
@@ -516,9 +514,9 @@ impl StreamCursor {
516514 self . index += 1 ;
517515 let next = self . stream [ self . index - 1 ] . clone ( ) ;
518516 match next {
519- TokenStream :: Tree ( ..) | TokenStream :: JointTree ( ..) => return Some ( next) ,
520- TokenStream :: Stream ( stream) => self . insert ( stream) ,
521517 TokenStream :: Empty => { }
518+ TokenStream :: Tree ( ..) => return Some ( next) ,
519+ TokenStream :: Stream ( stream) => self . insert ( stream) ,
522520 }
523521 } else if let Some ( ( stream, index) ) = self . stack . pop ( ) {
524522 self . stream = stream;
@@ -540,7 +538,7 @@ impl Iterator for Cursor {
540538
541539 fn next ( & mut self ) -> Option < TokenTree > {
542540 self . next_as_stream ( ) . map ( |stream| match stream {
543- TokenStream :: Tree ( tree) | TokenStream :: JointTree ( tree ) => tree,
541+ TokenStream :: Tree ( tree, _ ) => tree,
544542 _ => unreachable ! ( )
545543 } )
546544 }
@@ -550,18 +548,15 @@ impl Cursor {
550548 fn new ( stream : TokenStream ) -> Self {
551549 Cursor ( match stream {
552550 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 ) ,
555552 TokenStream :: Stream ( stream) => CursorKind :: Stream ( StreamCursor :: new ( stream) ) ,
556553 } )
557554 }
558555
559556 pub fn next_as_stream ( & mut self ) -> Option < TokenStream > {
560557 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) ,
565560 CursorKind :: Stream ( ref mut cursor) => return cursor. next_as_stream ( ) ,
566561 _ => return None ,
567562 } ;
@@ -574,7 +569,7 @@ impl Cursor {
574569 match self . 0 {
575570 _ if stream. is_empty ( ) => return ,
576571 CursorKind :: Empty => * self = stream. trees ( ) ,
577- CursorKind :: Tree ( _, consumed ) | CursorKind :: JointTree ( _, consumed) => {
572+ CursorKind :: Tree ( _, _, consumed) => {
578573 * self = TokenStream :: new ( vec ! [ self . original_stream( ) , stream] ) . trees ( ) ;
579574 if consumed {
580575 self . next ( ) ;
@@ -589,8 +584,8 @@ impl Cursor {
589584 pub fn original_stream ( & self ) -> TokenStream {
590585 match self . 0 {
591586 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 ) ,
594589 CursorKind :: Stream ( ref cursor) => TokenStream :: Stream (
595590 cursor. stack . get ( 0 ) . cloned ( ) . map ( |( stream, _) | stream)
596591 . unwrap_or_else ( || cursor. stream . clone ( ) )
@@ -602,9 +597,8 @@ impl Cursor {
602597 fn look_ahead ( streams : & [ TokenStream ] , mut n : usize ) -> Result < TokenTree , usize > {
603598 for stream in streams {
604599 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 ,
608602 TokenStream :: Stream ( ref stream) => match look_ahead ( stream, n) {
609603 Ok ( tree) => return Ok ( tree) ,
610604 Err ( n) => n,
@@ -617,10 +611,8 @@ impl Cursor {
617611
618612 match self . 0 {
619613 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) ,
624616 CursorKind :: Stream ( ref cursor) => {
625617 look_ahead ( & cursor. stream [ cursor. index ..] , n) . or_else ( |mut n| {
626618 for & ( ref stream, index) in cursor. stack . iter ( ) . rev ( ) {
@@ -653,8 +645,7 @@ impl From<TokenStream> for ThinTokenStream {
653645 fn from ( stream : TokenStream ) -> ThinTokenStream {
654646 ThinTokenStream ( match stream {
655647 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] ) ) ,
658649 TokenStream :: Stream ( stream) => Some ( stream) ,
659650 } )
660651 }
0 commit comments