@@ -28,6 +28,8 @@ use tokenstream::*;
2828use util:: small_vector:: SmallVector ;
2929use util:: move_map:: MoveMap ;
3030
31+ use std:: rc:: Rc ;
32+
3133pub trait Folder : Sized {
3234 // Any additions to this trait should happen in form
3335 // of a call to a public `noop_*` function that only calls
@@ -222,11 +224,11 @@ pub trait Folder : Sized {
222224 noop_fold_ty_params ( tps, self )
223225 }
224226
225- fn fold_tt ( & mut self , tt : TokenTree ) -> TokenTree {
227+ fn fold_tt ( & mut self , tt : & TokenTree ) -> TokenTree {
226228 noop_fold_tt ( tt, self )
227229 }
228230
229- fn fold_tts ( & mut self , tts : Vec < TokenTree > ) -> Vec < TokenTree > {
231+ fn fold_tts ( & mut self , tts : & [ TokenTree ] ) -> Vec < TokenTree > {
230232 noop_fold_tts ( tts, self )
231233 }
232234
@@ -501,7 +503,7 @@ pub fn noop_fold_mac<T: Folder>(Spanned {node, span}: Mac, fld: &mut T) -> Mac {
501503 Spanned {
502504 node : Mac_ {
503505 path : fld. fold_path ( node. path ) ,
504- tts : fld. fold_tts ( node. tts ) ,
506+ tts : fld. fold_tts ( & node. tts ) ,
505507 } ,
506508 span : fld. new_span ( span)
507509 }
@@ -528,26 +530,32 @@ pub fn noop_fold_arg<T: Folder>(Arg {id, pat, ty}: Arg, fld: &mut T) -> Arg {
528530 }
529531}
530532
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 {
533535 TokenTree :: Token ( span, ref tok) =>
534536 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+ } ) ) ,
546554 }
547555}
548556
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 ( )
551559}
552560
553561// 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)
605613 token:: NtIdent ( Box :: new ( Spanned :: < Ident > { node : fld. fold_ident ( id. node ) , ..* id} ) ) ,
606614 token:: NtMeta ( meta_item) => token:: NtMeta ( fld. fold_meta_item ( meta_item) ) ,
607615 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) ) ) ,
609617 token:: NtArm ( arm) => token:: NtArm ( fld. fold_arm ( arm) ) ,
610618 token:: NtImplItem ( arm) =>
611619 token:: NtImplItem ( arm. map ( |arm| fld. fold_impl_item ( arm)
0 commit comments