@@ -20,6 +20,10 @@ pub trait Visitor<'a, 'tcx: 'a>: Sized {
20
20
walk_arm ( self , arm) ;
21
21
}
22
22
23
+ fn visit_pat ( & mut self , pat : & Pat < ' tcx > ) {
24
+ walk_pat ( self , pat) ;
25
+ }
26
+
23
27
fn visit_const ( & mut self , _cnst : & ' tcx Const < ' tcx > ) { }
24
28
}
25
29
@@ -142,18 +146,19 @@ pub fn walk_expr<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, expr: &Exp
142
146
}
143
147
144
148
pub fn walk_stmt < ' a , ' tcx : ' a , V : Visitor < ' a , ' tcx > > ( visitor : & mut V , stmt : & Stmt < ' tcx > ) {
145
- match stmt. kind {
146
- StmtKind :: Expr { expr, scope : _ } => visitor. visit_expr ( & visitor. thir ( ) [ expr] ) ,
149
+ match & stmt. kind {
150
+ StmtKind :: Expr { expr, scope : _ } => visitor. visit_expr ( & visitor. thir ( ) [ * expr] ) ,
147
151
StmtKind :: Let {
148
152
initializer,
149
153
remainder_scope : _,
150
154
init_scope : _,
151
- pattern : _ ,
155
+ pattern,
152
156
lint_level : _,
153
157
} => {
154
158
if let Some ( init) = initializer {
155
- visitor. visit_expr ( & visitor. thir ( ) [ init] ) ;
159
+ visitor. visit_expr ( & visitor. thir ( ) [ * init] ) ;
156
160
}
161
+ visitor. visit_pat ( & pattern) ;
157
162
}
158
163
}
159
164
}
@@ -170,10 +175,48 @@ pub fn walk_block<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, block: &B
170
175
pub fn walk_arm < ' a , ' tcx : ' a , V : Visitor < ' a , ' tcx > > ( visitor : & mut V , arm : & Arm < ' tcx > ) {
171
176
match arm. guard {
172
177
Some ( Guard :: If ( expr) ) => visitor. visit_expr ( & visitor. thir ( ) [ expr] ) ,
173
- Some ( Guard :: IfLet ( ref _pat, expr) ) => {
178
+ Some ( Guard :: IfLet ( ref pat, expr) ) => {
179
+ visitor. visit_pat ( pat) ;
174
180
visitor. visit_expr ( & visitor. thir ( ) [ expr] ) ;
175
181
}
176
182
None => { }
177
183
}
184
+ visitor. visit_pat ( & arm. pattern ) ;
178
185
visitor. visit_expr ( & visitor. thir ( ) [ arm. body ] ) ;
179
186
}
187
+
188
+ pub fn walk_pat < ' a , ' tcx : ' a , V : Visitor < ' a , ' tcx > > ( visitor : & mut V , pat : & Pat < ' tcx > ) {
189
+ use PatKind :: * ;
190
+ match pat. kind . as_ref ( ) {
191
+ AscribeUserType { subpattern, .. }
192
+ | Deref { subpattern, .. }
193
+ | Binding { subpattern : Some ( subpattern) , .. } => visitor. visit_pat ( & subpattern) ,
194
+ Binding { .. } | Wild => { }
195
+ Variant { subpatterns, .. } | Leaf { subpatterns } => {
196
+ for subpattern in subpatterns {
197
+ visitor. visit_pat ( & subpattern. pattern ) ;
198
+ }
199
+ }
200
+ Constant { value } => visitor. visit_const ( value) ,
201
+ Range ( range) => {
202
+ visitor. visit_const ( range. lo ) ;
203
+ visitor. visit_const ( range. hi ) ;
204
+ }
205
+ Slice { prefix, slice, suffix } | Array { prefix, slice, suffix } => {
206
+ for subpattern in prefix {
207
+ visitor. visit_pat ( & subpattern) ;
208
+ }
209
+ if let Some ( pat) = slice {
210
+ visitor. visit_pat ( pat) ;
211
+ }
212
+ for subpattern in suffix {
213
+ visitor. visit_pat ( & subpattern) ;
214
+ }
215
+ }
216
+ Or { pats } => {
217
+ for pat in pats {
218
+ visitor. visit_pat ( & pat) ;
219
+ }
220
+ }
221
+ } ;
222
+ }
0 commit comments