@@ -188,132 +188,7 @@ fn find_sugg_for_if_let<'tcx>(
188
188
pub ( super ) fn check_match < ' tcx > ( cx : & LateContext < ' tcx > , expr : & ' tcx Expr < ' _ > , op : & Expr < ' _ > , arms : & [ Arm < ' _ > ] ) {
189
189
if arms. len ( ) == 2 {
190
190
let node_pair = ( & arms[ 0 ] . pat . kind , & arms[ 1 ] . pat . kind ) ;
191
- let found_good_method = match node_pair {
192
- (
193
- PatKind :: TupleStruct ( ref path_left, patterns_left, _) ,
194
- PatKind :: TupleStruct ( ref path_right, patterns_right, _) ,
195
- ) if patterns_left. len ( ) == 1 && patterns_right. len ( ) == 1 => {
196
- if let ( PatKind :: Wild , PatKind :: Wild ) = ( & patterns_left[ 0 ] . kind , & patterns_right[ 0 ] . kind ) {
197
- find_good_method_for_match (
198
- cx,
199
- arms,
200
- path_left,
201
- path_right,
202
- Item :: Lang ( ResultOk ) ,
203
- Item :: Lang ( ResultErr ) ,
204
- "is_ok()" ,
205
- "is_err()" ,
206
- )
207
- . or_else ( || {
208
- find_good_method_for_match (
209
- cx,
210
- arms,
211
- path_left,
212
- path_right,
213
- Item :: Diag ( sym:: IpAddr , sym ! ( V4 ) ) ,
214
- Item :: Diag ( sym:: IpAddr , sym ! ( V6 ) ) ,
215
- "is_ipv4()" ,
216
- "is_ipv6()" ,
217
- )
218
- } )
219
- } else {
220
- None
221
- }
222
- } ,
223
- ( PatKind :: TupleStruct ( ref path_left, patterns, _) , PatKind :: Path ( ref path_right) )
224
- | ( PatKind :: Path ( ref path_left) , PatKind :: TupleStruct ( ref path_right, patterns, _) )
225
- if patterns. len ( ) == 1 =>
226
- {
227
- if let PatKind :: Wild = patterns[ 0 ] . kind {
228
- find_good_method_for_match (
229
- cx,
230
- arms,
231
- path_left,
232
- path_right,
233
- Item :: Lang ( OptionSome ) ,
234
- Item :: Lang ( OptionNone ) ,
235
- "is_some()" ,
236
- "is_none()" ,
237
- )
238
- . or_else ( || {
239
- find_good_method_for_match (
240
- cx,
241
- arms,
242
- path_left,
243
- path_right,
244
- Item :: Lang ( PollReady ) ,
245
- Item :: Lang ( PollPending ) ,
246
- "is_ready()" ,
247
- "is_pending()" ,
248
- )
249
- } )
250
- } else {
251
- None
252
- }
253
- } ,
254
- ( PatKind :: TupleStruct ( ref path_left, patterns, _) , PatKind :: Wild ) if patterns. len ( ) == 1 => {
255
- if let PatKind :: Wild = patterns[ 0 ] . kind {
256
- let ident = match path_left {
257
- QPath :: Resolved ( _, path) => {
258
- let name = path. segments [ 0 ] . ident ;
259
- Some ( name)
260
- } ,
261
- _ => None ,
262
- } ;
263
- if let Some ( name) = ident {
264
- match name. as_str ( ) {
265
- "Ok" => find_good_method_for_matches_macro (
266
- cx,
267
- arms,
268
- path_left,
269
- Item :: Lang ( ResultOk ) ,
270
- "is_ok()" ,
271
- "is_err()" ,
272
- ) ,
273
- "Some" => find_good_method_for_matches_macro (
274
- cx,
275
- arms,
276
- path_left,
277
- Item :: Lang ( OptionSome ) ,
278
- "is_some()" ,
279
- "is_none()" ,
280
- ) ,
281
- _ => None ,
282
- }
283
- } else {
284
- None
285
- }
286
- } else {
287
- None
288
- }
289
- } ,
290
- ( PatKind :: Path ( ref path_left) , PatKind :: Wild ) => {
291
- let ident = match path_left {
292
- QPath :: Resolved ( _, path) => {
293
- let name = path. segments [ 0 ] . ident ;
294
- Some ( name)
295
- } ,
296
- _ => None ,
297
- } ;
298
-
299
- if let Some ( name) = ident {
300
- match name. as_str ( ) {
301
- "None" => find_good_method_for_matches_macro (
302
- cx,
303
- arms,
304
- path_left,
305
- Item :: Lang ( OptionNone ) ,
306
- "is_none()" ,
307
- "is_some()" ,
308
- ) ,
309
- _ => None ,
310
- }
311
- } else {
312
- None
313
- }
314
- } ,
315
- _ => None ,
316
- } ;
191
+ let found_good_method = found_good_method ( cx, arms, node_pair) ;
317
192
318
193
if let Some ( good_method) = found_good_method {
319
194
let span = expr. span . to ( op. span ) ;
@@ -339,6 +214,132 @@ pub(super) fn check_match<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, op
339
214
}
340
215
}
341
216
217
+ fn found_good_method < ' a > (
218
+ cx : & LateContext < ' _ > ,
219
+ arms : & [ Arm < ' _ > ] ,
220
+ node : ( & PatKind < ' _ > , & PatKind < ' _ > ) ,
221
+ ) -> Option < & ' a str > {
222
+ match node {
223
+ (
224
+ PatKind :: TupleStruct ( ref path_left, patterns_left, _) ,
225
+ PatKind :: TupleStruct ( ref path_right, patterns_right, _) ,
226
+ ) if patterns_left. len ( ) == 1 && patterns_right. len ( ) == 1 => {
227
+ if let ( PatKind :: Wild , PatKind :: Wild ) = ( & patterns_left[ 0 ] . kind , & patterns_right[ 0 ] . kind ) {
228
+ find_good_method_for_match (
229
+ cx,
230
+ arms,
231
+ path_left,
232
+ path_right,
233
+ Item :: Lang ( ResultOk ) ,
234
+ Item :: Lang ( ResultErr ) ,
235
+ "is_ok()" ,
236
+ "is_err()" ,
237
+ )
238
+ . or_else ( || {
239
+ find_good_method_for_match (
240
+ cx,
241
+ arms,
242
+ path_left,
243
+ path_right,
244
+ Item :: Diag ( sym:: IpAddr , sym ! ( V4 ) ) ,
245
+ Item :: Diag ( sym:: IpAddr , sym ! ( V6 ) ) ,
246
+ "is_ipv4()" ,
247
+ "is_ipv6()" ,
248
+ )
249
+ } )
250
+ } else {
251
+ None
252
+ }
253
+ } ,
254
+ ( PatKind :: TupleStruct ( ref path_left, patterns, _) , PatKind :: Path ( ref path_right) )
255
+ | ( PatKind :: Path ( ref path_left) , PatKind :: TupleStruct ( ref path_right, patterns, _) )
256
+ if patterns. len ( ) == 1 =>
257
+ {
258
+ if let PatKind :: Wild = patterns[ 0 ] . kind {
259
+ find_good_method_for_match (
260
+ cx,
261
+ arms,
262
+ path_left,
263
+ path_right,
264
+ Item :: Lang ( OptionSome ) ,
265
+ Item :: Lang ( OptionNone ) ,
266
+ "is_some()" ,
267
+ "is_none()" ,
268
+ )
269
+ . or_else ( || {
270
+ find_good_method_for_match (
271
+ cx,
272
+ arms,
273
+ path_left,
274
+ path_right,
275
+ Item :: Lang ( PollReady ) ,
276
+ Item :: Lang ( PollPending ) ,
277
+ "is_ready()" ,
278
+ "is_pending()" ,
279
+ )
280
+ } )
281
+ } else {
282
+ None
283
+ }
284
+ } ,
285
+ ( PatKind :: TupleStruct ( ref path_left, patterns, _) , PatKind :: Wild ) if patterns. len ( ) == 1 => {
286
+ if let PatKind :: Wild = patterns[ 0 ] . kind {
287
+ get_good_method ( cx, arms, path_left)
288
+ } else {
289
+ None
290
+ }
291
+ } ,
292
+ ( PatKind :: Path ( ref path_left) , PatKind :: Wild ) => {
293
+ if let Some ( name) = get_ident ( path_left) {
294
+ match name. as_str ( ) {
295
+ "None" => find_good_method_for_matches_macro (
296
+ cx,
297
+ arms,
298
+ path_left,
299
+ Item :: Lang ( OptionNone ) ,
300
+ "is_none()" ,
301
+ "is_some()" ,
302
+ ) ,
303
+ _ => None ,
304
+ }
305
+ } else {
306
+ None
307
+ }
308
+ } ,
309
+ _ => None ,
310
+ }
311
+ }
312
+
313
+ fn get_ident ( path : & QPath < ' _ > ) -> Option < rustc_span:: symbol:: Ident > {
314
+ match path {
315
+ QPath :: Resolved ( _, path) => {
316
+ let name = path. segments [ 0 ] . ident ;
317
+ Some ( name)
318
+ } ,
319
+ _ => None ,
320
+ }
321
+ }
322
+
323
+ fn get_good_method < ' a > ( cx : & LateContext < ' _ > , arms : & [ Arm < ' _ > ] , path_left : & QPath < ' _ > ) -> Option < & ' a str > {
324
+ if let Some ( name) = get_ident ( path_left) {
325
+ return match name. as_str ( ) {
326
+ "Ok" => {
327
+ find_good_method_for_matches_macro ( cx, arms, path_left, Item :: Lang ( ResultOk ) , "is_ok()" , "is_err()" )
328
+ } ,
329
+ "Some" => find_good_method_for_matches_macro (
330
+ cx,
331
+ arms,
332
+ path_left,
333
+ Item :: Lang ( OptionSome ) ,
334
+ "is_some()" ,
335
+ "is_none()" ,
336
+ ) ,
337
+ _ => None ,
338
+ } ;
339
+ }
340
+ None
341
+ }
342
+
342
343
#[ derive( Clone , Copy ) ]
343
344
enum Item {
344
345
Lang ( LangItem ) ,
@@ -406,7 +407,6 @@ fn find_good_method_for_match<'a>(
406
407
}
407
408
}
408
409
409
- #[ expect( clippy:: too_many_arguments) ]
410
410
fn find_good_method_for_matches_macro < ' a > (
411
411
cx : & LateContext < ' _ > ,
412
412
arms : & [ Arm < ' _ > ] ,
0 commit comments