@@ -152,7 +152,7 @@ fn lint_same_cond(cx: &LateContext<'_, '_>, conds: &[&Expr]) {
152
152
let eq: & dyn Fn ( & & Expr , & & Expr ) -> bool =
153
153
& |& lhs, & rhs| -> bool { SpanlessEq :: new ( cx) . ignore_fn ( ) . eq_expr ( lhs, rhs) } ;
154
154
155
- if let Some ( ( i, j) ) = search_same ( conds, hash, eq) {
155
+ for ( i, j) in search_same ( conds, hash, eq) {
156
156
span_note_and_lint (
157
157
cx,
158
158
IFS_SAME_COND ,
@@ -185,7 +185,7 @@ fn lint_match_arms(cx: &LateContext<'_, '_>, expr: &Expr) {
185
185
} ;
186
186
187
187
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) {
189
189
span_lint_and_then (
190
190
cx,
191
191
MATCH_SAME_ARMS ,
@@ -217,7 +217,10 @@ fn lint_match_arms(cx: &LateContext<'_, '_>, expr: &Expr) {
217
217
) ,
218
218
) ;
219
219
} 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
+ ) ;
221
224
}
222
225
}
223
226
} ,
@@ -323,21 +326,33 @@ where
323
326
None
324
327
}
325
328
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 ) >
327
330
where
328
- Hash : Fn ( & T ) -> u64 ,
329
331
Eq : Fn ( & T , & T ) -> bool ,
330
332
{
331
- // common cases
332
333
if exprs. len ( ) < 2 {
333
- return None ;
334
+ None
334
335
} else if exprs. len ( ) == 2 {
335
- return if eq ( & exprs[ 0 ] , & exprs[ 1 ] ) {
336
+ if eq ( & exprs[ 0 ] , & exprs[ 1 ] ) {
336
337
Some ( ( & exprs[ 0 ] , & exprs[ 1 ] ) )
337
338
} else {
338
339
None
339
- } ;
340
+ }
341
+ } else {
342
+ None
340
343
}
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 ( ) ;
341
356
342
357
let mut map: FxHashMap < _ , Vec < & _ > > =
343
358
FxHashMap :: with_capacity_and_hasher ( exprs. len ( ) , BuildHasherDefault :: default ( ) ) ;
@@ -347,7 +362,7 @@ where
347
362
Entry :: Occupied ( mut o) => {
348
363
for o in o. get ( ) {
349
364
if eq ( o, expr) {
350
- return Some ( ( o, expr) ) ;
365
+ match_expr_list . push ( ( o, expr) ) ;
351
366
}
352
367
}
353
368
o. get_mut ( ) . push ( expr) ;
@@ -358,5 +373,5 @@ where
358
373
}
359
374
}
360
375
361
- None
376
+ match_expr_list
362
377
}
0 commit comments