@@ -18,7 +18,7 @@ use syn::{
18
18
parse:: { Parse , ParseStream , Parser as _} ,
19
19
parse_macro_input,
20
20
punctuated:: Punctuated ,
21
- Expr , ExprCall , ExprInfer , Pat , Token ,
21
+ Expr , ExprCall , Pat , Token ,
22
22
} ;
23
23
24
24
/// This is an implementation detail of `googletest::matches_pattern!`. It
@@ -147,21 +147,15 @@ struct TupleFieldPattern {
147
147
matcher : Expr ,
148
148
}
149
149
150
- impl Parse for TupleFieldPattern {
150
+ struct MaybeTupleFieldPattern ( Option < TupleFieldPattern > ) ;
151
+
152
+ impl Parse for MaybeTupleFieldPattern {
151
153
fn parse ( input : ParseStream ) -> syn:: Result < Self > {
152
- let ref_token = input. parse ( ) ?;
153
- let matcher = input. parse ( ) ?;
154
- match matcher {
155
- // `_` is an expr in const generics contexts, but is not supported in regular
156
- // `Expr` use like in the `matches_pattern` custom syntax. So fail in that case.
157
- // That should allow `into_match_expr` above to fall back to `into_match_pattern_expr`
158
- // and still attempt to parse `matcher` as a pattern.
159
- Expr :: Infer ( ExprInfer { underscore_token, .. } ) => compile_err (
160
- underscore_token. spans [ 0 ] ,
161
- "unexpected `_` for `matches_pattern!` tuple field matcher" ,
162
- ) ,
163
- _ => Ok ( TupleFieldPattern { ref_token, matcher } ) ,
164
- }
154
+ let pattern = match input. parse :: < Option < Token ! [ _] > > ( ) ? {
155
+ Some ( _) => None ,
156
+ None => Some ( TupleFieldPattern { ref_token : input. parse ( ) ?, matcher : input. parse ( ) ? } ) ,
157
+ } ;
158
+ Ok ( MaybeTupleFieldPattern ( pattern) )
165
159
}
166
160
}
167
161
@@ -170,13 +164,16 @@ fn parse_tuple_pattern_args(
170
164
struct_name : TokenStream ,
171
165
group_content : TokenStream ,
172
166
) -> syn:: Result < TokenStream > {
173
- let parser = Punctuated :: < TupleFieldPattern , Token ! [ , ] > :: parse_terminated;
174
- let fields = parser. parse2 ( group_content) ?. into_iter ( ) . enumerate ( ) . map (
175
- |( index, TupleFieldPattern { ref_token, matcher } ) | {
167
+ let parser = Punctuated :: < MaybeTupleFieldPattern , Token ! [ , ] > :: parse_terminated;
168
+ let fields = parser
169
+ . parse2 ( group_content) ?
170
+ . into_iter ( )
171
+ . enumerate ( )
172
+ . filter_map ( |( index, maybe_pattern) | maybe_pattern. 0 . map ( |pattern| ( index, pattern) ) )
173
+ . map ( |( index, TupleFieldPattern { ref_token, matcher } ) | {
176
174
let index = syn:: Index :: from ( index) ;
177
175
quote ! { googletest:: matchers:: field!( #struct_name. #index, #ref_token #matcher) }
178
- } ,
179
- ) ;
176
+ } ) ;
180
177
Ok ( quote ! {
181
178
googletest:: matchers:: __internal_unstable_do_not_depend_on_these:: is(
182
179
stringify!( #struct_name) ,
0 commit comments