@@ -390,25 +390,6 @@ impl TokenStream {
390
390
. collect ( ) )
391
391
} ) )
392
392
}
393
-
394
- fn first_tree_and_joint ( & self ) -> Option < TreeAndJoint > {
395
- self . 0 . as_ref ( ) . map ( |stream| {
396
- stream. first ( ) . unwrap ( ) . clone ( )
397
- } )
398
- }
399
-
400
- fn last_tree_if_joint ( & self ) -> Option < TokenTree > {
401
- match self . 0 {
402
- None => None ,
403
- Some ( ref stream) => {
404
- if let ( tree, Joint ) = stream. last ( ) . unwrap ( ) {
405
- Some ( tree. clone ( ) )
406
- } else {
407
- None
408
- }
409
- }
410
- }
411
- }
412
393
}
413
394
414
395
// 99.5%+ of the time we have 1 or 2 elements in this vector.
@@ -421,18 +402,49 @@ impl TokenStreamBuilder {
421
402
}
422
403
423
404
pub fn push < T : Into < TokenStream > > ( & mut self , stream : T ) {
424
- let stream = stream. into ( ) ;
425
- let last_tree_if_joint = self . 0 . last ( ) . and_then ( TokenStream :: last_tree_if_joint) ;
426
- if let Some ( TokenTree :: Token ( last_token) ) = last_tree_if_joint {
427
- if let Some ( ( TokenTree :: Token ( token) , is_joint) ) = stream. first_tree_and_joint ( ) {
428
- if let Some ( glued_tok) = last_token. glue ( & token) {
429
- let last_stream = self . 0 . pop ( ) . unwrap ( ) ;
430
- self . push_all_but_last_tree ( & last_stream) ;
431
- let glued_tt = TokenTree :: Token ( glued_tok) ;
432
- let glued_tokenstream = TokenStream :: new ( vec ! [ ( glued_tt, is_joint) ] ) ;
433
- self . 0 . push ( glued_tokenstream) ;
434
- self . push_all_but_first_tree ( & stream) ;
435
- return
405
+ let mut stream = stream. into ( ) ;
406
+
407
+ // If `self` is not empty and the last tree within the last stream is a
408
+ // token tree marked with `Joint`...
409
+ if let Some ( TokenStream ( Some ( ref mut last_stream_lrc) ) ) = self . 0 . last_mut ( ) {
410
+ if let Some ( ( TokenTree :: Token ( last_token) , Joint ) ) = last_stream_lrc. last ( ) {
411
+
412
+ // ...and `stream` is not empty and the first tree within it is
413
+ // a token tree...
414
+ if let TokenStream ( Some ( ref mut stream_lrc) ) = stream {
415
+ if let Some ( ( TokenTree :: Token ( token) , is_joint) ) = stream_lrc. first ( ) {
416
+
417
+ // ...and the two tokens can be glued together...
418
+ if let Some ( glued_tok) = last_token. glue ( & token) {
419
+
420
+ // ...then do so, by overwriting the last token
421
+ // tree in `self` and removing the first token tree
422
+ // from `stream`. This requires using `make_mut()`
423
+ // on the last stream in `self` and on `stream`,
424
+ // and in practice this doesn't cause cloning 99.9%
425
+ // of the time.
426
+
427
+ // Overwrite the last token tree with the merged
428
+ // token.
429
+ let last_vec_mut = Lrc :: make_mut ( last_stream_lrc) ;
430
+ * last_vec_mut. last_mut ( ) . unwrap ( ) =
431
+ ( TokenTree :: Token ( glued_tok) , * is_joint) ;
432
+
433
+ // Remove the first token tree from `stream`. (This
434
+ // is almost always the only tree in `stream`.)
435
+ let stream_vec_mut = Lrc :: make_mut ( stream_lrc) ;
436
+ stream_vec_mut. remove ( 0 ) ;
437
+
438
+ // Don't push `stream` if it's empty -- that could
439
+ // block subsequent token gluing, by getting
440
+ // between two token trees that should be glued
441
+ // together.
442
+ if !stream. is_empty ( ) {
443
+ self . 0 . push ( stream) ;
444
+ }
445
+ return ;
446
+ }
447
+ }
436
448
}
437
449
}
438
450
}
@@ -442,26 +454,6 @@ impl TokenStreamBuilder {
442
454
pub fn build ( self ) -> TokenStream {
443
455
TokenStream :: from_streams ( self . 0 )
444
456
}
445
-
446
- fn push_all_but_last_tree ( & mut self , stream : & TokenStream ) {
447
- if let Some ( ref streams) = stream. 0 {
448
- let len = streams. len ( ) ;
449
- match len {
450
- 1 => { }
451
- _ => self . 0 . push ( TokenStream ( Some ( Lrc :: new ( streams[ 0 .. len - 1 ] . to_vec ( ) ) ) ) ) ,
452
- }
453
- }
454
- }
455
-
456
- fn push_all_but_first_tree ( & mut self , stream : & TokenStream ) {
457
- if let Some ( ref streams) = stream. 0 {
458
- let len = streams. len ( ) ;
459
- match len {
460
- 1 => { }
461
- _ => self . 0 . push ( TokenStream ( Some ( Lrc :: new ( streams[ 1 .. len] . to_vec ( ) ) ) ) ) ,
462
- }
463
- }
464
- }
465
457
}
466
458
467
459
#[ derive( Clone ) ]
0 commit comments