@@ -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