@@ -277,12 +277,6 @@ impl ToInternal<rustc_errors::Level> for Level {
277
277
278
278
pub struct FreeFunctions ;
279
279
280
- #[ derive( Clone ) ]
281
- pub struct TokenStreamIter {
282
- cursor : tokenstream:: Cursor ,
283
- stack : Vec < TokenTree < Group , Punct , Ident , Literal > > ,
284
- }
285
-
286
280
#[ derive( Clone ) ]
287
281
pub struct Group {
288
282
delimiter : Delimiter ,
@@ -385,8 +379,6 @@ impl<'a, 'b> Rustc<'a, 'b> {
385
379
impl server:: Types for Rustc < ' _ , ' _ > {
386
380
type FreeFunctions = FreeFunctions ;
387
381
type TokenStream = TokenStream ;
388
- type TokenStreamBuilder = tokenstream:: TokenStreamBuilder ;
389
- type TokenStreamIter = TokenStreamIter ;
390
382
type Group = Group ;
391
383
type Punct = Punct ;
392
384
type Ident = Ident ;
@@ -411,9 +403,6 @@ impl server::FreeFunctions for Rustc<'_, '_> {
411
403
}
412
404
413
405
impl server:: TokenStream for Rustc < ' _ , ' _ > {
414
- fn new ( & mut self ) -> Self :: TokenStream {
415
- TokenStream :: default ( )
416
- }
417
406
fn is_empty ( & mut self , stream : & Self :: TokenStream ) -> bool {
418
407
stream. is_empty ( )
419
408
}
@@ -484,53 +473,74 @@ impl server::TokenStream for Rustc<'_, '_> {
484
473
) -> Self :: TokenStream {
485
474
tree. to_internal ( )
486
475
}
487
- fn into_iter ( & mut self , stream : Self :: TokenStream ) -> Self :: TokenStreamIter {
488
- TokenStreamIter { cursor : stream. into_trees ( ) , stack : vec ! [ ] }
489
- }
490
- }
491
-
492
- impl server:: TokenStreamBuilder for Rustc < ' _ , ' _ > {
493
- fn new ( & mut self ) -> Self :: TokenStreamBuilder {
494
- tokenstream:: TokenStreamBuilder :: new ( )
495
- }
496
- fn push ( & mut self , builder : & mut Self :: TokenStreamBuilder , stream : Self :: TokenStream ) {
497
- builder. push ( stream) ;
476
+ fn concat_trees (
477
+ & mut self ,
478
+ base : Option < Self :: TokenStream > ,
479
+ trees : Vec < TokenTree < Self :: Group , Self :: Punct , Self :: Ident , Self :: Literal > > ,
480
+ ) -> Self :: TokenStream {
481
+ let mut builder = tokenstream:: TokenStreamBuilder :: new ( ) ;
482
+ if let Some ( base) = base {
483
+ builder. push ( base) ;
484
+ }
485
+ for tree in trees {
486
+ builder. push ( tree. to_internal ( ) ) ;
487
+ }
488
+ builder. build ( )
498
489
}
499
- fn build ( & mut self , builder : Self :: TokenStreamBuilder ) -> Self :: TokenStream {
490
+ fn concat_streams (
491
+ & mut self ,
492
+ base : Option < Self :: TokenStream > ,
493
+ streams : Vec < Self :: TokenStream > ,
494
+ ) -> Self :: TokenStream {
495
+ let mut builder = tokenstream:: TokenStreamBuilder :: new ( ) ;
496
+ if let Some ( base) = base {
497
+ builder. push ( base) ;
498
+ }
499
+ for stream in streams {
500
+ builder. push ( stream) ;
501
+ }
500
502
builder. build ( )
501
503
}
502
- }
503
-
504
- impl server:: TokenStreamIter for Rustc < ' _ , ' _ > {
505
- fn next (
504
+ fn into_iter (
506
505
& mut self ,
507
- iter : & mut Self :: TokenStreamIter ,
508
- ) -> Option < TokenTree < Self :: Group , Self :: Punct , Self :: Ident , Self :: Literal > > {
506
+ stream : Self :: TokenStream ,
507
+ ) -> Vec < TokenTree < Self :: Group , Self :: Punct , Self :: Ident , Self :: Literal > > {
508
+ // XXX: This is a raw port of the previous approach, and can probably be
509
+ // optimized.
510
+ let mut cursor = stream. into_trees ( ) ;
511
+ let mut stack = Vec :: new ( ) ;
512
+ let mut tts = Vec :: new ( ) ;
509
513
loop {
510
- let tree = iter. stack . pop ( ) . or_else ( || {
511
- let next = iter. cursor . next_with_spacing ( ) ?;
512
- Some ( TokenTree :: from_internal ( ( next, & mut iter. stack , self ) ) )
513
- } ) ?;
514
- // A hack used to pass AST fragments to attribute and derive macros
515
- // as a single nonterminal token instead of a token stream.
516
- // Such token needs to be "unwrapped" and not represented as a delimited group.
517
- // FIXME: It needs to be removed, but there are some compatibility issues (see #73345).
518
- if let TokenTree :: Group ( ref group) = tree {
519
- if group. flatten {
520
- iter. cursor . append ( group. stream . clone ( ) ) ;
521
- continue ;
514
+ let next = stack. pop ( ) . or_else ( || {
515
+ let next = cursor. next_with_spacing ( ) ?;
516
+ Some ( TokenTree :: from_internal ( ( next, & mut stack, self ) ) )
517
+ } ) ;
518
+ match next {
519
+ Some ( TokenTree :: Group ( group) ) => {
520
+ // A hack used to pass AST fragments to attribute and derive
521
+ // macros as a single nonterminal token instead of a token
522
+ // stream. Such token needs to be "unwrapped" and not
523
+ // represented as a delimited group.
524
+ // FIXME: It needs to be removed, but there are some
525
+ // compatibility issues (see #73345).
526
+ if group. flatten {
527
+ cursor. append ( group. stream ) ;
528
+ continue ;
529
+ }
530
+ tts. push ( TokenTree :: Group ( group) ) ;
522
531
}
532
+ Some ( tt) => tts. push ( tt) ,
533
+ None => return tts,
523
534
}
524
- return Some ( tree) ;
525
535
}
526
536
}
527
537
}
528
538
529
539
impl server:: Group for Rustc < ' _ , ' _ > {
530
- fn new ( & mut self , delimiter : Delimiter , stream : Self :: TokenStream ) -> Self :: Group {
540
+ fn new ( & mut self , delimiter : Delimiter , stream : Option < Self :: TokenStream > ) -> Self :: Group {
531
541
Group {
532
542
delimiter,
533
- stream,
543
+ stream : stream . unwrap_or_default ( ) ,
534
544
span : DelimSpan :: from_single ( server:: Context :: call_site ( self ) ) ,
535
545
flatten : false ,
536
546
}
0 commit comments