@@ -28,6 +28,8 @@ use tokenstream::*;
28
28
use util:: small_vector:: SmallVector ;
29
29
use util:: move_map:: MoveMap ;
30
30
31
+ use std:: rc:: Rc ;
32
+
31
33
pub trait Folder : Sized {
32
34
// Any additions to this trait should happen in form
33
35
// of a call to a public `noop_*` function that only calls
@@ -222,11 +224,11 @@ pub trait Folder : Sized {
222
224
noop_fold_ty_params ( tps, self )
223
225
}
224
226
225
- fn fold_tt ( & mut self , tt : TokenTree ) -> TokenTree {
227
+ fn fold_tt ( & mut self , tt : & TokenTree ) -> TokenTree {
226
228
noop_fold_tt ( tt, self )
227
229
}
228
230
229
- fn fold_tts ( & mut self , tts : Vec < TokenTree > ) -> Vec < TokenTree > {
231
+ fn fold_tts ( & mut self , tts : & [ TokenTree ] ) -> Vec < TokenTree > {
230
232
noop_fold_tts ( tts, self )
231
233
}
232
234
@@ -501,7 +503,7 @@ pub fn noop_fold_mac<T: Folder>(Spanned {node, span}: Mac, fld: &mut T) -> Mac {
501
503
Spanned {
502
504
node : Mac_ {
503
505
path : fld. fold_path ( node. path ) ,
504
- tts : fld. fold_tts ( node. tts ) ,
506
+ tts : fld. fold_tts ( & node. tts ) ,
505
507
} ,
506
508
span : fld. new_span ( span)
507
509
}
@@ -528,26 +530,32 @@ pub fn noop_fold_arg<T: Folder>(Arg {id, pat, ty}: Arg, fld: &mut T) -> Arg {
528
530
}
529
531
}
530
532
531
- pub fn noop_fold_tt < T : Folder > ( tt : TokenTree , fld : & mut T ) -> TokenTree {
532
- match tt {
533
+ pub fn noop_fold_tt < T : Folder > ( tt : & TokenTree , fld : & mut T ) -> TokenTree {
534
+ match * tt {
533
535
TokenTree :: Token ( span, ref tok) =>
534
536
TokenTree :: Token ( span, fld. fold_token ( tok. clone ( ) ) ) ,
535
- TokenTree :: Delimited ( span, delimed) => TokenTree :: Delimited ( span, Delimited {
536
- delim : delimed. delim ,
537
- open_span : delimed. open_span ,
538
- tts : fld. fold_tts ( delimed. tts ) ,
539
- close_span : delimed. close_span ,
540
- } ) ,
541
- TokenTree :: Sequence ( span, seq) => TokenTree :: Sequence ( span, SequenceRepetition {
542
- tts : fld. fold_tts ( seq. tts ) ,
543
- separator : seq. separator . clone ( ) . map ( |tok| fld. fold_token ( tok) ) ,
544
- ..seq
545
- } ) ,
537
+ TokenTree :: Delimited ( span, ref delimed) => {
538
+ TokenTree :: Delimited ( span, Rc :: new (
539
+ Delimited {
540
+ delim : delimed. delim ,
541
+ open_span : delimed. open_span ,
542
+ tts : fld. fold_tts ( & delimed. tts ) ,
543
+ close_span : delimed. close_span ,
544
+ }
545
+ ) )
546
+ } ,
547
+ TokenTree :: Sequence ( span, ref seq) =>
548
+ TokenTree :: Sequence ( span,
549
+ Rc :: new ( SequenceRepetition {
550
+ tts : fld. fold_tts ( & seq. tts ) ,
551
+ separator : seq. separator . clone ( ) . map ( |tok| fld. fold_token ( tok) ) ,
552
+ ..* * seq
553
+ } ) ) ,
546
554
}
547
555
}
548
556
549
- pub fn noop_fold_tts < T : Folder > ( tts : Vec < TokenTree > , fld : & mut T ) -> Vec < TokenTree > {
550
- tts. move_map ( |tt| fld. fold_tt ( tt) )
557
+ pub fn noop_fold_tts < T : Folder > ( tts : & [ TokenTree ] , fld : & mut T ) -> Vec < TokenTree > {
558
+ tts. iter ( ) . map ( |tt| fld. fold_tt ( tt) ) . collect ( )
551
559
}
552
560
553
561
// apply ident folder if it's an ident, apply other folds to interpolated nodes
@@ -605,7 +613,7 @@ pub fn noop_fold_interpolated<T: Folder>(nt: token::Nonterminal, fld: &mut T)
605
613
token:: NtIdent ( Box :: new ( Spanned :: < Ident > { node : fld. fold_ident ( id. node ) , ..* id} ) ) ,
606
614
token:: NtMeta ( meta_item) => token:: NtMeta ( fld. fold_meta_item ( meta_item) ) ,
607
615
token:: NtPath ( path) => token:: NtPath ( Box :: new ( fld. fold_path ( * path) ) ) ,
608
- token:: NtTT ( tt) => token:: NtTT ( tt . map ( |tt| fld. fold_tt ( tt) ) ) ,
616
+ token:: NtTT ( tt) => token:: NtTT ( P ( fld. fold_tt ( & tt) ) ) ,
609
617
token:: NtArm ( arm) => token:: NtArm ( fld. fold_arm ( arm) ) ,
610
618
token:: NtImplItem ( arm) =>
611
619
token:: NtImplItem ( arm. map ( |arm| fld. fold_impl_item ( arm)
0 commit comments