@@ -188,132 +188,7 @@ fn find_sugg_for_if_let<'tcx>(
188188pub ( super ) fn check_match < ' tcx > ( cx : & LateContext < ' tcx > , expr : & ' tcx Expr < ' _ > , op : & Expr < ' _ > , arms : & [ Arm < ' _ > ] ) {
189189 if arms. len ( ) == 2 {
190190 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) ;
317192
318193 if let Some ( good_method) = found_good_method {
319194 let span = expr. span . to ( op. span ) ;
@@ -339,6 +214,132 @@ pub(super) fn check_match<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, op
339214 }
340215}
341216
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+
342343#[ derive( Clone , Copy ) ]
343344enum Item {
344345 Lang ( LangItem ) ,
@@ -406,7 +407,6 @@ fn find_good_method_for_match<'a>(
406407 }
407408}
408409
409- #[ expect( clippy:: too_many_arguments) ]
410410fn find_good_method_for_matches_macro < ' a > (
411411 cx : & LateContext < ' _ > ,
412412 arms : & [ Arm < ' _ > ] ,
0 commit comments