@@ -19,6 +19,28 @@ use syntax_pos::Span;
19
19
use parse:: token:: Token ;
20
20
use tokenstream:: { TokenTree , TokenStream } ;
21
21
22
+ pub enum Action < T > {
23
+ Reuse ,
24
+ Remove ,
25
+ Add ( Vec < T > ) ,
26
+ Replace ( Vec < T > ) ,
27
+ }
28
+
29
+ impl < T > Action < T > {
30
+ pub fn map < R > ( self , mut f : impl FnMut ( T ) -> R ) -> Action < R > {
31
+ match self {
32
+ Action :: Reuse => Action :: Reuse ,
33
+ Action :: Remove => Action :: Remove ,
34
+ Action :: Add ( list) => {
35
+ Action :: Add ( list. into_iter ( ) . map ( |item| f ( item) ) . collect ( ) )
36
+ }
37
+ Action :: Replace ( list) => {
38
+ Action :: Replace ( list. into_iter ( ) . map ( |item| f ( item) ) . collect ( ) )
39
+ }
40
+ }
41
+ }
42
+ }
43
+
22
44
pub enum FnKind < ' a > {
23
45
/// fn foo() or extern "Abi" fn foo()
24
46
ItemFn ( Ident , FnHeader , & ' a mut Visibility , & ' a mut Block ) ,
@@ -62,13 +84,13 @@ pub trait MutVisitor: Sized {
62
84
}
63
85
fn visit_foreign_item ( & mut self , i : & mut ForeignItem ) { walk_foreign_item ( self , i) }
64
86
fn visit_global_asm ( & mut self , ga : & mut GlobalAsm ) { walk_global_asm ( self , ga) }
65
- fn visit_item ( & mut self , i : & mut P < Item > ) -> Option < Vec < P < Item > > > {
87
+ fn visit_item ( & mut self , i : & mut P < Item > ) -> Action < P < Item > > {
66
88
walk_item ( self , i) ;
67
- None
89
+ Action :: Reuse
68
90
}
69
91
fn visit_local ( & mut self , l : & mut Local ) { walk_local ( self , l) }
70
92
fn visit_block ( & mut self , b : & mut Block ) { walk_block ( self , b) }
71
- fn visit_stmt ( & mut self , s : & mut Stmt ) -> Option < Vec < Stmt > > {
93
+ fn visit_stmt ( & mut self , s : & mut Stmt ) -> Action < Stmt > {
72
94
walk_stmt ( self , s)
73
95
}
74
96
fn visit_arm ( & mut self , a : & mut Arm ) { walk_arm ( self , a) }
@@ -173,15 +195,27 @@ macro_rules! walk_list_mut {
173
195
break ;
174
196
}
175
197
176
- if let Some ( replacement) = $visitor. $method( & mut $list[ i] , $( , $extra_args) * ) {
177
- $list. remove( i) ;
178
- let rlen = replacement. len( ) ;
179
- for ( j, r) in replacement. into_iter( ) . enumerate( ) {
180
- $list. insert( i + j, r) ;
198
+ match $visitor. $method( & mut $list[ i] , $( , $extra_args) * ) {
199
+ Action :: Reuse => i += 1 ,
200
+ Action :: Remove => {
201
+ $list. remove( i) ;
202
+ }
203
+ Action :: Add ( list) => {
204
+ i += 1 ;
205
+ let rlen = list. len( ) ;
206
+ for ( j, r) in list. into_iter( ) . enumerate( ) {
207
+ $list. insert( i + j, r) ;
208
+ }
209
+ i += rlen;
210
+ }
211
+ Action :: Replace ( list) => {
212
+ $list. remove( i) ;
213
+ let rlen = list. len( ) ;
214
+ for ( j, r) in list. into_iter( ) . enumerate( ) {
215
+ $list. insert( i + j, r) ;
216
+ }
217
+ i += rlen;
181
218
}
182
- i += rlen;
183
- } else {
184
- i += 1 ;
185
219
}
186
220
}
187
221
}
@@ -650,34 +684,32 @@ pub fn walk_block<V: MutVisitor>(visitor: &mut V, block: &mut Block) {
650
684
walk_list_mut ! ( visitor, visit_stmt, & mut block. stmts) ;
651
685
}
652
686
653
- pub fn walk_stmt < V : MutVisitor > ( visitor : & mut V , statement : & mut Stmt ) -> Option < Vec < Stmt > > {
687
+ pub fn walk_stmt < V : MutVisitor > ( visitor : & mut V , statement : & mut Stmt ) -> Action < Stmt > {
654
688
match statement. node {
655
689
StmtKind :: Local ( ref mut local) => {
656
690
visitor. visit_local ( local) ;
657
- None
691
+ Action :: Reuse
658
692
} ,
659
693
StmtKind :: Item ( ref mut item) => {
660
- visitor. visit_item ( item) . map ( |replacement| {
661
- replacement. into_iter ( ) . map ( |item| {
662
- Stmt {
663
- id : visitor. new_id ( statement. id ) ,
664
- node : StmtKind :: Item ( item) ,
665
- span : visitor. new_span ( statement. span ) ,
666
- }
667
- } ) . collect ( )
694
+ visitor. visit_item ( item) . map ( |item| {
695
+ Stmt {
696
+ id : visitor. new_id ( statement. id ) ,
697
+ node : StmtKind :: Item ( item) ,
698
+ span : visitor. new_span ( statement. span ) ,
699
+ }
668
700
} )
669
701
} ,
670
702
StmtKind :: Expr ( ref mut expression) | StmtKind :: Semi ( ref mut expression) => {
671
703
visitor. visit_expr ( expression) ;
672
- None
704
+ Action :: Reuse
673
705
}
674
706
StmtKind :: Mac ( ref mut mac) => {
675
707
let ( ref mut mac, _, ref mut attrs) = * * mac;
676
708
visitor. visit_mac ( mac) ;
677
709
for attr in attrs. iter_mut ( ) {
678
710
visitor. visit_attribute ( attr) ;
679
711
}
680
- None
712
+ Action :: Reuse
681
713
}
682
714
}
683
715
}
@@ -893,7 +925,7 @@ pub fn walk_attribute<V: MutVisitor>(visitor: &mut V, attr: &mut Attribute) {
893
925
pub fn walk_tt < V : MutVisitor > ( visitor : & mut V , tt : TokenTree ) {
894
926
match tt {
895
927
TokenTree :: Token ( _, tok) => visitor. visit_token ( tok) ,
896
- TokenTree :: Delimited ( _, _, tts) => visitor. visit_tts ( tts. stream ( ) ) ,
928
+ TokenTree :: Delimited ( _, _, tts) => visitor. visit_tts ( tts) ,
897
929
}
898
930
}
899
931
0 commit comments