@@ -12,14 +12,19 @@ use std::panic;
12
12
13
13
use rustc_data_structures:: flat_map_in_place:: FlatMapInPlace ;
14
14
use rustc_span:: source_map:: Spanned ;
15
- use rustc_span:: { Ident , Span } ;
15
+ use rustc_span:: { Ident , Span , Symbol } ;
16
16
use smallvec:: { SmallVec , smallvec} ;
17
17
use thin_vec:: ThinVec ;
18
18
19
19
use crate :: ast:: * ;
20
20
use crate :: ptr:: P ;
21
21
use crate :: tokenstream:: * ;
22
- use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt , VisitorResult , try_visit, visit_opt, walk_list} ;
22
+ use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt , LifetimeCtxt , VisitorResult , try_visit} ;
23
+ use crate :: {
24
+ define_named_walk, impl_visitable, impl_visitable_calling, impl_visitable_calling_walkable,
25
+ impl_visitable_direct, impl_visitable_list, impl_visitable_noop, impl_walkable,
26
+ visit_visitable, visit_visitable_with, walk_walkable,
27
+ } ;
23
28
24
29
mod sealed {
25
30
use rustc_ast_ir:: visit:: VisitorResult ;
@@ -36,11 +41,144 @@ mod sealed {
36
41
37
42
use sealed:: MutVisitorResult ;
38
43
44
+ pub ( crate ) trait MutVisitable < V : MutVisitor > {
45
+ type Extra : Copy ;
46
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) ;
47
+ }
48
+
49
+ impl < V : MutVisitor , T : ?Sized > MutVisitable < V > for P < T >
50
+ where
51
+ T : MutVisitable < V > ,
52
+ {
53
+ type Extra = T :: Extra ;
54
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
55
+ ( * * self ) . visit_mut ( visitor, extra)
56
+ }
57
+ }
58
+
59
+ impl < V : MutVisitor , T > MutVisitable < V > for Option < T >
60
+ where
61
+ T : MutVisitable < V > ,
62
+ {
63
+ type Extra = T :: Extra ;
64
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
65
+ if let Some ( this) = self {
66
+ this. visit_mut ( visitor, extra)
67
+ }
68
+ }
69
+ }
70
+
71
+ impl < V : MutVisitor , T > MutVisitable < V > for Spanned < T >
72
+ where
73
+ T : MutVisitable < V > ,
74
+ {
75
+ type Extra = T :: Extra ;
76
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
77
+ let Spanned { span, node } = self ;
78
+ span. visit_mut ( visitor, ( ) ) ;
79
+ node. visit_mut ( visitor, extra) ;
80
+ }
81
+ }
82
+
83
+ impl < V : MutVisitor , T > MutVisitable < V > for [ T ]
84
+ where
85
+ T : MutVisitable < V > ,
86
+ {
87
+ type Extra = T :: Extra ;
88
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
89
+ for item in self {
90
+ item. visit_mut ( visitor, extra) ;
91
+ }
92
+ }
93
+ }
94
+
95
+ impl < V : MutVisitor , T > MutVisitable < V > for Vec < T >
96
+ where
97
+ T : MutVisitable < V > ,
98
+ {
99
+ type Extra = T :: Extra ;
100
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
101
+ for item in self {
102
+ item. visit_mut ( visitor, extra) ;
103
+ }
104
+ }
105
+ }
106
+
107
+ impl < V : MutVisitor , T > MutVisitable < V > for ( T , )
108
+ where
109
+ T : MutVisitable < V > ,
110
+ {
111
+ type Extra = T :: Extra ;
112
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
113
+ self . 0 . visit_mut ( visitor, extra) ;
114
+ }
115
+ }
116
+
117
+ impl < V : MutVisitor , T1 , T2 > MutVisitable < V > for ( T1 , T2 )
118
+ where
119
+ T1 : MutVisitable < V , Extra = ( ) > ,
120
+ T2 : MutVisitable < V , Extra = ( ) > ,
121
+ {
122
+ type Extra = ( ) ;
123
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
124
+ self . 0 . visit_mut ( visitor, extra) ;
125
+ self . 1 . visit_mut ( visitor, extra) ;
126
+ }
127
+ }
128
+
129
+ impl < V : MutVisitor , T1 , T2 , T3 > MutVisitable < V > for ( T1 , T2 , T3 )
130
+ where
131
+ T1 : MutVisitable < V , Extra = ( ) > ,
132
+ T2 : MutVisitable < V , Extra = ( ) > ,
133
+ T3 : MutVisitable < V , Extra = ( ) > ,
134
+ {
135
+ type Extra = ( ) ;
136
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
137
+ self . 0 . visit_mut ( visitor, extra) ;
138
+ self . 1 . visit_mut ( visitor, extra) ;
139
+ self . 2 . visit_mut ( visitor, extra) ;
140
+ }
141
+ }
142
+
143
+ impl < V : MutVisitor , T1 , T2 , T3 , T4 > MutVisitable < V > for ( T1 , T2 , T3 , T4 )
144
+ where
145
+ T1 : MutVisitable < V , Extra = ( ) > ,
146
+ T2 : MutVisitable < V , Extra = ( ) > ,
147
+ T3 : MutVisitable < V , Extra = ( ) > ,
148
+ T4 : MutVisitable < V , Extra = ( ) > ,
149
+ {
150
+ type Extra = ( ) ;
151
+ fn visit_mut ( & mut self , visitor : & mut V , extra : Self :: Extra ) {
152
+ self . 0 . visit_mut ( visitor, extra) ;
153
+ self . 1 . visit_mut ( visitor, extra) ;
154
+ self . 2 . visit_mut ( visitor, extra) ;
155
+ self . 3 . visit_mut ( visitor, extra) ;
156
+ }
157
+ }
158
+
159
+ pub trait MutWalkable < V : MutVisitor > {
160
+ fn walk_mut ( & mut self , visitor : & mut V ) ;
161
+ }
162
+
39
163
super :: common_visitor_and_walkers!( ( mut ) MutVisitor ) ;
40
164
41
165
macro_rules! generate_flat_map_visitor_fns {
42
166
( $( $name: ident, $Ty: ty, $flat_map_fn: ident$( , $param: ident: $ParamTy: ty) * ; ) +) => {
43
167
$(
168
+ #[ allow( unused_parens) ]
169
+ impl <V : MutVisitor > MutVisitable <V > for ThinVec <$Ty> {
170
+ type Extra = ( $( $ParamTy) ,* ) ;
171
+
172
+ #[ inline]
173
+ fn visit_mut(
174
+ & mut self ,
175
+ visitor: & mut V ,
176
+ ( $( $param) ,* ) : Self :: Extra ,
177
+ ) -> V :: Result {
178
+ $name( visitor, self $( , $param) * )
179
+ }
180
+ }
181
+
44
182
fn $name<V : MutVisitor >(
45
183
vis: & mut V ,
46
184
values: & mut ThinVec <$Ty>,
@@ -78,15 +216,6 @@ pub fn walk_flat_map_pat_field<T: MutVisitor>(
78
216
smallvec ! [ fp]
79
217
}
80
218
81
- fn visit_nested_use_tree < V : MutVisitor > (
82
- vis : & mut V ,
83
- nested_tree : & mut UseTree ,
84
- nested_id : & mut NodeId ,
85
- ) {
86
- vis. visit_id ( nested_id) ;
87
- vis. visit_use_tree ( nested_tree) ;
88
- }
89
-
90
219
macro_rules! generate_walk_flat_map_fns {
91
220
( $( $fn_name: ident( $Ty: ty$( , $extra_name: ident: $ExtraTy: ty) * ) => $visit_fn_name: ident; ) +) => { $(
92
221
pub fn $fn_name<V : MutVisitor >( vis: & mut V , mut value: $Ty$( , $extra_name: $ExtraTy) * ) -> SmallVec <[ $Ty; 1 ] > {
@@ -109,14 +238,6 @@ generate_walk_flat_map_fns! {
109
238
walk_flat_map_assoc_item( P <AssocItem >, ctxt: AssocCtxt ) => visit_assoc_item;
110
239
}
111
240
112
- fn walk_ty_alias_where_clauses < T : MutVisitor > ( vis : & mut T , tawcs : & mut TyAliasWhereClauses ) {
113
- let TyAliasWhereClauses { before, after, split : _ } = tawcs;
114
- let TyAliasWhereClause { has_where_token : _, span : span_before } = before;
115
- let TyAliasWhereClause { has_where_token : _, span : span_after } = after;
116
- vis. visit_span ( span_before) ;
117
- vis. visit_span ( span_after) ;
118
- }
119
-
120
241
pub fn walk_filter_map_expr < T : MutVisitor > ( vis : & mut T , mut e : P < Expr > ) -> Option < P < Expr > > {
121
242
vis. visit_expr ( & mut e) ;
122
243
Some ( e)
0 commit comments