@@ -277,12 +277,6 @@ impl ToInternal<rustc_errors::Level> for Level {
277277
278278pub struct FreeFunctions ;
279279
280- #[ derive( Clone ) ]
281- pub struct TokenStreamIter {
282- cursor : tokenstream:: Cursor ,
283- stack : Vec < TokenTree < Group , Punct , Ident , Literal > > ,
284- }
285-
286280#[ derive( Clone ) ]
287281pub struct Group {
288282 delimiter : Delimiter ,
@@ -385,8 +379,6 @@ impl<'a, 'b> Rustc<'a, 'b> {
385379impl server:: Types for Rustc < ' _ , ' _ > {
386380 type FreeFunctions = FreeFunctions ;
387381 type TokenStream = TokenStream ;
388- type TokenStreamBuilder = tokenstream:: TokenStreamBuilder ;
389- type TokenStreamIter = TokenStreamIter ;
390382 type Group = Group ;
391383 type Punct = Punct ;
392384 type Ident = Ident ;
@@ -411,9 +403,6 @@ impl server::FreeFunctions for Rustc<'_, '_> {
411403}
412404
413405impl server:: TokenStream for Rustc < ' _ , ' _ > {
414- fn new ( & mut self ) -> Self :: TokenStream {
415- TokenStream :: default ( )
416- }
417406 fn is_empty ( & mut self , stream : & Self :: TokenStream ) -> bool {
418407 stream. is_empty ( )
419408 }
@@ -484,53 +473,74 @@ impl server::TokenStream for Rustc<'_, '_> {
484473 ) -> Self :: TokenStream {
485474 tree. to_internal ( )
486475 }
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 ( )
498489 }
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+ }
500502 builder. build ( )
501503 }
502- }
503-
504- impl server:: TokenStreamIter for Rustc < ' _ , ' _ > {
505- fn next (
504+ fn into_iter (
506505 & 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 ( ) ;
509513 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) ) ;
522531 }
532+ Some ( tt) => tts. push ( tt) ,
533+ None => return tts,
523534 }
524- return Some ( tree) ;
525535 }
526536 }
527537}
528538
529539impl 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 {
531541 Group {
532542 delimiter,
533- stream,
543+ stream : stream . unwrap_or_default ( ) ,
534544 span : DelimSpan :: from_single ( server:: Context :: call_site ( self ) ) ,
535545 flatten : false ,
536546 }
0 commit comments