@@ -240,36 +240,45 @@ pub fn walk_pat<'thir, 'tcx: 'thir, V: Visitor<'thir, 'tcx>>(
240
240
visitor : & mut V ,
241
241
pat : & ' thir Pat < ' tcx > ,
242
242
) {
243
- use PatKind :: * ;
243
+ for_each_immediate_subpat ( pat, |p| visitor. visit_pat ( p) ) ;
244
+ }
245
+
246
+ /// Invokes `callback` on each immediate subpattern of `pat`, if any.
247
+ /// A building block for assembling THIR pattern visitors.
248
+ pub ( crate ) fn for_each_immediate_subpat < ' a , ' tcx > (
249
+ pat : & ' a Pat < ' tcx > ,
250
+ mut callback : impl FnMut ( & ' a Pat < ' tcx > ) ,
251
+ ) {
244
252
match & pat. kind {
245
- AscribeUserType { subpattern, ascription : _ }
246
- | Deref { subpattern }
247
- | DerefPattern { subpattern, .. }
248
- | Binding { subpattern : Some ( subpattern) , .. } => visitor. visit_pat ( subpattern) ,
249
- Binding { .. } | Wild | Never | Error ( _) => { }
250
- Variant { subpatterns, adt_def : _, args : _, variant_index : _ } | Leaf { subpatterns } => {
251
- for subpattern in subpatterns {
252
- visitor. visit_pat ( & subpattern. pattern ) ;
253
+ PatKind :: Wild
254
+ | PatKind :: Binding { subpattern : None , .. }
255
+ | PatKind :: Constant { value : _ }
256
+ | PatKind :: Range ( _)
257
+ | PatKind :: Never
258
+ | PatKind :: Error ( _) => { }
259
+
260
+ PatKind :: AscribeUserType { subpattern, .. }
261
+ | PatKind :: Binding { subpattern : Some ( subpattern) , .. }
262
+ | PatKind :: Deref { subpattern }
263
+ | PatKind :: DerefPattern { subpattern, .. }
264
+ | PatKind :: ExpandedConstant { subpattern, .. } => callback ( subpattern) ,
265
+
266
+ PatKind :: Variant { subpatterns, .. } | PatKind :: Leaf { subpatterns } => {
267
+ for field_pat in subpatterns {
268
+ callback ( & field_pat. pattern ) ;
253
269
}
254
270
}
255
- Constant { value : _ } => { }
256
- ExpandedConstant { def_id : _, is_inline : _, subpattern } => visitor. visit_pat ( subpattern) ,
257
- Range ( _) => { }
258
- Slice { prefix, slice, suffix } | Array { prefix, slice, suffix } => {
259
- for subpattern in prefix. iter ( ) {
260
- visitor. visit_pat ( subpattern) ;
261
- }
262
- if let Some ( pat) = slice {
263
- visitor. visit_pat ( pat) ;
264
- }
265
- for subpattern in suffix. iter ( ) {
266
- visitor. visit_pat ( subpattern) ;
271
+
272
+ PatKind :: Slice { prefix, slice, suffix } | PatKind :: Array { prefix, slice, suffix } => {
273
+ for pat in prefix. iter ( ) . chain ( slice. as_deref ( ) ) . chain ( suffix) {
274
+ callback ( pat) ;
267
275
}
268
276
}
269
- Or { pats } => {
270
- for pat in pats. iter ( ) {
271
- visitor. visit_pat ( pat) ;
277
+
278
+ PatKind :: Or { pats } => {
279
+ for pat in pats {
280
+ callback ( pat) ;
272
281
}
273
282
}
274
- } ;
283
+ }
275
284
}
0 commit comments