@@ -152,7 +152,7 @@ fn lint_same_cond(cx: &LateContext<'_, '_>, conds: &[&Expr]) {
152152    let  eq:  & dyn  Fn ( & & Expr ,  & & Expr )  -> bool  =
153153        & |& lhs,  & rhs| -> bool  {  SpanlessEq :: new ( cx) . ignore_fn ( ) . eq_expr ( lhs,  rhs)  } ; 
154154
155-     if   let   Some ( ( i,  j) )  =  search_same ( conds,  hash,  eq)  { 
155+     for   ( i,  j)   in  search_same ( conds,  hash,  eq)  { 
156156        span_note_and_lint ( 
157157            cx, 
158158            IFS_SAME_COND , 
@@ -185,7 +185,7 @@ fn lint_match_arms(cx: &LateContext<'_, '_>, expr: &Expr) {
185185        } ; 
186186
187187        let  indexed_arms:  Vec < ( usize ,  & Arm ) >  = arms. iter ( ) . enumerate ( ) . collect ( ) ; 
188-         if   let   Some ( ( & ( _,  i) ,  & ( _,  j) ) )  =  search_same ( & indexed_arms,  hash,  eq)  { 
188+         for   ( & ( _,  i) ,  & ( _,  j) )   in  search_same ( & indexed_arms,  hash,  eq)  { 
189189            span_lint_and_then ( 
190190                cx, 
191191                MATCH_SAME_ARMS , 
@@ -217,7 +217,10 @@ fn lint_match_arms(cx: &LateContext<'_, '_>, expr: &Expr) {
217217                                ) , 
218218                            ) ; 
219219                        }  else  { 
220-                             db. span_note ( i. body . span ,  & format ! ( "consider refactoring into `{} | {}`" ,  lhs,  rhs) ) ; 
220+                             db. span_help ( 
221+                                 i. pats [ 0 ] . span , 
222+                                 & format ! ( "consider refactoring into `{} | {}`" ,  lhs,  rhs) , 
223+                             ) ; 
221224                        } 
222225                    } 
223226                } , 
@@ -323,21 +326,33 @@ where
323326    None 
324327} 
325328
326- fn  search_same < T ,   Hash ,  Eq > ( exprs :  & [ T ] ,  hash :   Hash ,   eq :  Eq )  -> Option < ( & T ,  & T ) > 
329+ fn  search_common_cases < ' a ,   T ,  Eq > ( exprs :  & ' a   [ T ] ,  eq :  & Eq )  -> Option < ( & ' a   T ,  & ' a   T ) > 
327330where 
328-     Hash :  Fn ( & T )  -> u64 , 
329331    Eq :  Fn ( & T ,  & T )  -> bool , 
330332{ 
331-     // common cases 
332333    if  exprs. len ( )  < 2  { 
333-         return   None ; 
334+         None 
334335    }  else  if  exprs. len ( )  == 2  { 
335-         return   if  eq ( & exprs[ 0 ] ,  & exprs[ 1 ] )  { 
336+         if  eq ( & exprs[ 0 ] ,  & exprs[ 1 ] )  { 
336337            Some ( ( & exprs[ 0 ] ,  & exprs[ 1 ] ) ) 
337338        }  else  { 
338339            None 
339-         } ; 
340+         } 
341+     }  else  { 
342+         None 
340343    } 
344+ } 
345+ 
346+ fn  search_same < T ,  Hash ,  Eq > ( exprs :  & [ T ] ,  hash :  Hash ,  eq :  Eq )  -> Vec < ( & T ,  & T ) > 
347+ where 
348+     Hash :  Fn ( & T )  -> u64 , 
349+     Eq :  Fn ( & T ,  & T )  -> bool , 
350+ { 
351+     if  let  Some ( expr)  = search_common_cases ( & exprs,  & eq)  { 
352+         return  vec ! [ expr] ; 
353+     } 
354+ 
355+     let  mut  match_expr_list:  Vec < ( & T ,  & T ) >  = Vec :: new ( ) ; 
341356
342357    let  mut  map:  FxHashMap < _ ,  Vec < & _ > >  =
343358        FxHashMap :: with_capacity_and_hasher ( exprs. len ( ) ,  BuildHasherDefault :: default ( ) ) ; 
@@ -347,7 +362,7 @@ where
347362            Entry :: Occupied ( mut  o)  => { 
348363                for  o in  o. get ( )  { 
349364                    if  eq ( o,  expr)  { 
350-                         return   Some ( ( o,  expr) ) ; 
365+                         match_expr_list . push ( ( o,  expr) ) ; 
351366                    } 
352367                } 
353368                o. get_mut ( ) . push ( expr) ; 
@@ -358,5 +373,5 @@ where
358373        } 
359374    } 
360375
361-     None 
376+     match_expr_list 
362377} 
0 commit comments