@@ -77,6 +77,34 @@ impl hir::Pat {
77
77
} ) ;
78
78
}
79
79
80
+ /// Call `f` on every "binding" in a pattern, e.g., on `a` in
81
+ /// `match foo() { Some(a) => (), None => () }`.
82
+ ///
83
+ /// When encountering an or-pattern `p_0 | ... | p_n` only `p_0` will be visited.
84
+ pub fn each_binding_or_first < F > ( & self , c : & mut F )
85
+ where F : FnMut ( hir:: BindingAnnotation , HirId , Span , ast:: Ident ) ,
86
+ {
87
+ match & self . node {
88
+ PatKind :: Binding ( bm, _, ident, sub) => {
89
+ c ( * bm, self . hir_id , self . span , * ident) ;
90
+ sub. iter ( ) . for_each ( |p| p. each_binding_or_first ( c) ) ;
91
+ }
92
+ PatKind :: Or ( ps) => ps[ 0 ] . each_binding_or_first ( c) ,
93
+ PatKind :: Struct ( _, fs, _) => fs. iter ( ) . for_each ( |f| f. pat . each_binding_or_first ( c) ) ,
94
+ PatKind :: TupleStruct ( _, ps, _) | PatKind :: Tuple ( ps, _) => {
95
+ ps. iter ( ) . for_each ( |p| p. each_binding_or_first ( c) ) ;
96
+ }
97
+ PatKind :: Box ( p) | PatKind :: Ref ( p, _) => p. each_binding_or_first ( c) ,
98
+ PatKind :: Slice ( before, slice, after) => {
99
+ before. iter ( )
100
+ . chain ( slice. iter ( ) )
101
+ . chain ( after. iter ( ) )
102
+ . for_each ( |p| p. each_binding_or_first ( c) ) ;
103
+ }
104
+ PatKind :: Wild | PatKind :: Lit ( _) | PatKind :: Range ( ..) | PatKind :: Path ( _) => { }
105
+ }
106
+ }
107
+
80
108
/// Checks if the pattern contains any patterns that bind something to
81
109
/// an ident, e.g., `foo`, or `Foo(foo)` or `foo @ Bar(..)`.
82
110
pub fn contains_bindings ( & self ) -> bool {
0 commit comments