@@ -216,16 +216,7 @@ impl FlatTree {
216216 text : Vec :: new ( ) ,
217217 version,
218218 } ;
219- let group = proc_macro_srv:: Group {
220- delimiter : proc_macro_srv:: Delimiter :: None ,
221- stream : Some ( tokenstream) ,
222- span : proc_macro_srv:: DelimSpan {
223- open : call_site,
224- close : call_site,
225- entire : call_site,
226- } ,
227- } ;
228- w. write_tokenstream ( & group) ;
219+ w. write_tokenstream ( call_site, & tokenstream) ;
229220
230221 FlatTree {
231222 subtree : if version >= ENCODE_CLOSE_SPAN_VERSION {
@@ -267,16 +258,7 @@ impl FlatTree {
267258 text : Vec :: new ( ) ,
268259 version,
269260 } ;
270- let group = proc_macro_srv:: Group {
271- delimiter : proc_macro_srv:: Delimiter :: None ,
272- stream : Some ( tokenstream) ,
273- span : proc_macro_srv:: DelimSpan {
274- open : call_site,
275- close : call_site,
276- entire : call_site,
277- } ,
278- } ;
279- w. write_tokenstream ( & group) ;
261+ w. write_tokenstream ( call_site, & tokenstream) ;
280262
281263 FlatTree {
282264 subtree : if version >= ENCODE_CLOSE_SPAN_VERSION {
@@ -491,7 +473,7 @@ impl SpanTransformer for Span {
491473}
492474
493475struct Writer < ' a , ' span , S : SpanTransformer , W > {
494- work : VecDeque < ( usize , W ) > ,
476+ work : VecDeque < ( usize , usize , W ) > ,
495477 string_table : FxHashMap < std:: borrow:: Cow < ' a , str > , u32 > ,
496478 span_data_table : & ' span mut S :: Table ,
497479 version : u32 ,
@@ -508,14 +490,13 @@ impl<'a, T: SpanTransformer> Writer<'a, '_, T, tt::iter::TtIter<'a, T::Span>> {
508490 fn write_subtree ( & mut self , root : tt:: SubtreeView < ' a , T :: Span > ) {
509491 let subtree = root. top_subtree ( ) ;
510492 self . enqueue ( subtree, root. iter ( ) ) ;
511- while let Some ( ( idx, subtree) ) = self . work . pop_front ( ) {
512- self . subtree ( idx, subtree) ;
493+ while let Some ( ( idx, len , subtree) ) = self . work . pop_front ( ) {
494+ self . subtree ( idx, len , subtree) ;
513495 }
514496 }
515497
516- fn subtree ( & mut self , idx : usize , subtree : tt:: iter:: TtIter < ' a , T :: Span > ) {
498+ fn subtree ( & mut self , idx : usize , n_tt : usize , subtree : tt:: iter:: TtIter < ' a , T :: Span > ) {
517499 let mut first_tt = self . token_tree . len ( ) ;
518- let n_tt = subtree. clone ( ) . count ( ) ; // FIXME: `count()` walks over the entire iterator.
519500 self . token_tree . resize ( first_tt + n_tt, !0 ) ;
520501
521502 self . subtree [ idx] . tt = [ first_tt as u32 , ( first_tt + n_tt) as u32 ] ;
@@ -594,7 +575,8 @@ impl<'a, T: SpanTransformer> Writer<'a, '_, T, tt::iter::TtIter<'a, T::Span>> {
594575 let close = self . token_id_of ( subtree. delimiter . close ) ;
595576 let delimiter_kind = subtree. delimiter . kind ;
596577 self . subtree . push ( SubtreeRepr { open, close, kind : delimiter_kind, tt : [ !0 , !0 ] } ) ;
597- self . work . push_back ( ( idx, contents) ) ;
578+ // FIXME: `count()` walks over the entire iterator.
579+ self . work . push_back ( ( idx, contents. clone ( ) . count ( ) , contents) ) ;
598580 idx as u32
599581 }
600582}
@@ -624,26 +606,43 @@ impl<'a, T: SpanTransformer, U> Writer<'a, '_, T, U> {
624606}
625607
626608#[ cfg( feature = "sysroot-abi" ) ]
627- impl < ' a , T : SpanTransformer > Writer < ' a , ' _ , T , & ' a proc_macro_srv:: Group < T :: Span > > {
628- fn write_tokenstream ( & mut self , root : & ' a proc_macro_srv:: Group < T :: Span > ) {
629- self . enqueue_group ( root) ;
630-
631- while let Some ( ( idx, group) ) = self . work . pop_front ( ) {
632- self . group ( idx, group) ;
609+ impl < ' a , T : SpanTransformer >
610+ Writer < ' a , ' _ , T , Option < proc_macro_srv:: TokenStreamIter < ' a , T :: Span > > >
611+ {
612+ fn write_tokenstream (
613+ & mut self ,
614+ call_site : T :: Span ,
615+ root : & ' a proc_macro_srv:: TokenStream < T :: Span > ,
616+ ) {
617+ let call_site = self . token_id_of ( call_site) ;
618+ self . subtree . push ( SubtreeRepr {
619+ open : call_site,
620+ close : call_site,
621+ kind : tt:: DelimiterKind :: Invisible ,
622+ tt : [ !0 , !0 ] ,
623+ } ) ;
624+ self . work . push_back ( ( 0 , root. len ( ) , Some ( root. iter ( ) ) ) ) ;
625+
626+ while let Some ( ( idx, len, group) ) = self . work . pop_front ( ) {
627+ self . group ( idx, len, group) ;
633628 }
634629 }
635630
636- fn group ( & mut self , idx : usize , group : & ' a proc_macro_srv:: Group < T :: Span > ) {
631+ fn group (
632+ & mut self ,
633+ idx : usize ,
634+ n_tt : usize ,
635+ group : Option < proc_macro_srv:: TokenStreamIter < ' a , T :: Span > > ,
636+ ) {
637637 let mut first_tt = self . token_tree . len ( ) ;
638- let n_tt = group. stream . as_ref ( ) . map_or ( 0 , |it| it. len ( ) ) ;
639638 self . token_tree . resize ( first_tt + n_tt, !0 ) ;
640639
641640 self . subtree [ idx] . tt = [ first_tt as u32 , ( first_tt + n_tt) as u32 ] ;
642641
643- for tt in group. stream . iter ( ) . flat_map ( |it| it . iter ( ) ) {
642+ for tt in group. into_iter ( ) . flatten ( ) {
644643 let idx_tag = match tt {
645644 proc_macro_srv:: TokenTree :: Group ( group) => {
646- let idx = self . enqueue_group ( group) ;
645+ let idx = self . enqueue ( group) ;
647646 idx << 2
648647 }
649648 proc_macro_srv:: TokenTree :: Literal ( lit) => {
@@ -706,7 +705,7 @@ impl<'a, T: SpanTransformer> Writer<'a, '_, T, &'a proc_macro_srv::Group<T::Span
706705 }
707706 }
708707
709- fn enqueue_group ( & mut self , group : & ' a proc_macro_srv:: Group < T :: Span > ) -> u32 {
708+ fn enqueue ( & mut self , group : & ' a proc_macro_srv:: Group < T :: Span > ) -> u32 {
710709 let idx = self . subtree . len ( ) ;
711710 let open = self . token_id_of ( group. span . open ) ;
712711 let close = self . token_id_of ( group. span . close ) ;
@@ -717,7 +716,11 @@ impl<'a, T: SpanTransformer> Writer<'a, '_, T, &'a proc_macro_srv::Group<T::Span
717716 proc_macro_srv:: Delimiter :: None => tt:: DelimiterKind :: Invisible ,
718717 } ;
719718 self . subtree . push ( SubtreeRepr { open, close, kind : delimiter_kind, tt : [ !0 , !0 ] } ) ;
720- self . work . push_back ( ( idx, group) ) ;
719+ self . work . push_back ( (
720+ idx,
721+ group. stream . as_ref ( ) . map_or ( 0 , |stream| stream. len ( ) ) ,
722+ group. stream . as_ref ( ) . map ( |ts| ts. iter ( ) ) ,
723+ ) ) ;
721724 idx as u32
722725 }
723726}
@@ -959,7 +962,6 @@ impl<T: SpanTransformer> Reader<'_, T> {
959962 } ;
960963 res[ i] = Some ( g) ;
961964 }
962- // FIXME: double check this
963965 proc_macro_srv:: TokenStream :: new ( vec ! [ proc_macro_srv:: TokenTree :: Group (
964966 res[ 0 ] . take( ) . unwrap( ) ,
965967 ) ] )
0 commit comments