@@ -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) ;
@@ -367,8 +374,7 @@ impl TokenStream {
367374 /// Returns true if the token tree is a joint operation w.r.t. `proc_macro::TokenNode`.
368375 pub fn as_tree ( self ) -> ( TokenTree , bool /* joint? */ ) {
369376 match self {
370- TokenStream :: Tree ( tree) => ( tree, false ) ,
371- TokenStream :: JointTree ( tree) => ( tree, true ) ,
377+ TokenStream :: Tree ( tree, is_joint) => ( tree, is_joint == Joint ) ,
372378 _ => unreachable ! ( ) ,
373379 }
374380 }
@@ -379,8 +385,7 @@ impl TokenStream {
379385 let mut i = 0 ;
380386 while let Some ( stream) = trees. next_as_stream ( ) {
381387 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) ,
384389 _ => unreachable ! ( )
385390 } ) ;
386391 i += 1 ;
@@ -393,27 +398,25 @@ impl TokenStream {
393398 let mut result = Vec :: new ( ) ;
394399 while let Some ( stream) = trees. next_as_stream ( ) {
395400 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) ,
398402 _ => unreachable ! ( )
399403 } ) ;
400404 }
401405 TokenStream :: new ( result)
402406 }
403407
404- fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , bool ) > {
408+ fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , IsJoint ) > {
405409 match self {
406410 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) ) ,
409412 TokenStream :: Stream ( ref stream) => stream. first ( ) . unwrap ( ) . first_tree_and_joint ( ) ,
410413 }
411414 }
412415
413416 fn last_tree_if_joint ( & self ) -> Option < TokenTree > {
414417 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 ( ) ) ,
417420 TokenStream :: Stream ( ref stream) => stream. last ( ) . unwrap ( ) . last_tree_if_joint ( ) ,
418421 }
419422 }
@@ -437,11 +440,7 @@ impl TokenStreamBuilder {
437440 self . push_all_but_last_tree ( & last_stream) ;
438441 let glued_span = last_span. to ( span) ;
439442 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) ;
445444 self . 0 . push ( glued_tokenstream) ;
446445 self . push_all_but_first_tree ( & stream) ;
447446 return
@@ -491,8 +490,7 @@ pub struct Cursor(CursorKind);
491490#[ derive( Clone ) ]
492491enum CursorKind {
493492 Empty ,
494- Tree ( TokenTree , bool /* consumed? */ ) ,
495- JointTree ( TokenTree , bool /* consumed? */ ) ,
493+ Tree ( TokenTree , IsJoint , bool /* consumed? */ ) ,
496494 Stream ( StreamCursor ) ,
497495}
498496
@@ -514,9 +512,9 @@ impl StreamCursor {
514512 self . index += 1 ;
515513 let next = self . stream [ self . index - 1 ] . clone ( ) ;
516514 match next {
517- TokenStream :: Tree ( ..) | TokenStream :: JointTree ( ..) => return Some ( next) ,
518- TokenStream :: Stream ( stream) => self . insert ( stream) ,
519515 TokenStream :: Empty => { }
516+ TokenStream :: Tree ( ..) => return Some ( next) ,
517+ TokenStream :: Stream ( stream) => self . insert ( stream) ,
520518 }
521519 } else if let Some ( ( stream, index) ) = self . stack . pop ( ) {
522520 self . stream = stream;
@@ -538,7 +536,7 @@ impl Iterator for Cursor {
538536
539537 fn next ( & mut self ) -> Option < TokenTree > {
540538 self . next_as_stream ( ) . map ( |stream| match stream {
541- TokenStream :: Tree ( tree) | TokenStream :: JointTree ( tree ) => tree,
539+ TokenStream :: Tree ( tree, _ ) => tree,
542540 _ => unreachable ! ( )
543541 } )
544542 }
@@ -548,18 +546,15 @@ impl Cursor {
548546 fn new ( stream : TokenStream ) -> Self {
549547 Cursor ( match stream {
550548 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 ) ,
553550 TokenStream :: Stream ( stream) => CursorKind :: Stream ( StreamCursor :: new ( stream) ) ,
554551 } )
555552 }
556553
557554 pub fn next_as_stream ( & mut self ) -> Option < TokenStream > {
558555 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) ,
563558 CursorKind :: Stream ( ref mut cursor) => return cursor. next_as_stream ( ) ,
564559 _ => return None ,
565560 } ;
@@ -572,7 +567,7 @@ impl Cursor {
572567 match self . 0 {
573568 _ if stream. is_empty ( ) => return ,
574569 CursorKind :: Empty => * self = stream. trees ( ) ,
575- CursorKind :: Tree ( _, consumed ) | CursorKind :: JointTree ( _, consumed) => {
570+ CursorKind :: Tree ( _, _, consumed) => {
576571 * self = TokenStream :: new ( vec ! [ self . original_stream( ) , stream] ) . trees ( ) ;
577572 if consumed {
578573 self . next ( ) ;
@@ -587,8 +582,8 @@ impl Cursor {
587582 pub fn original_stream ( & self ) -> TokenStream {
588583 match self . 0 {
589584 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 ) ,
592587 CursorKind :: Stream ( ref cursor) => TokenStream :: Stream (
593588 cursor. stack . get ( 0 ) . cloned ( ) . map ( |( stream, _) | stream)
594589 . unwrap_or_else ( || cursor. stream . clone ( ) )
@@ -600,9 +595,8 @@ impl Cursor {
600595 fn look_ahead ( streams : & [ TokenStream ] , mut n : usize ) -> Result < TokenTree , usize > {
601596 for stream in streams {
602597 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 ,
606600 TokenStream :: Stream ( ref stream) => match look_ahead ( stream, n) {
607601 Ok ( tree) => return Ok ( tree) ,
608602 Err ( n) => n,
@@ -615,10 +609,8 @@ impl Cursor {
615609
616610 match self . 0 {
617611 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) ,
622614 CursorKind :: Stream ( ref cursor) => {
623615 look_ahead ( & cursor. stream [ cursor. index ..] , n) . or_else ( |mut n| {
624616 for & ( ref stream, index) in cursor. stack . iter ( ) . rev ( ) {
@@ -651,8 +643,7 @@ impl From<TokenStream> for ThinTokenStream {
651643 fn from ( stream : TokenStream ) -> ThinTokenStream {
652644 ThinTokenStream ( match stream {
653645 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] ) ) ,
656647 TokenStream :: Stream ( stream) => Some ( stream) ,
657648 } )
658649 }
0 commit comments