@@ -3296,11 +3296,11 @@ impl_lint_pass!(Methods => [
3296
3296
/// Extracts a method call name, args, and `Span` of the method name.
3297
3297
fn method_call < ' tcx > (
3298
3298
recv : & ' tcx hir:: Expr < ' tcx > ,
3299
- ) -> Option < ( & ' tcx str , & ' tcx hir:: Expr < ' tcx > , & ' tcx [ hir:: Expr < ' tcx > ] , Span ) > {
3300
- if let ExprKind :: MethodCall ( path, receiver, args, _ ) = recv. kind {
3299
+ ) -> Option < ( & ' tcx str , & ' tcx hir:: Expr < ' tcx > , & ' tcx [ hir:: Expr < ' tcx > ] , Span , Span ) > {
3300
+ if let ExprKind :: MethodCall ( path, receiver, args, call_span ) = recv. kind {
3301
3301
if !args. iter ( ) . any ( |e| e. span . from_expansion ( ) ) && !receiver. span . from_expansion ( ) {
3302
3302
let name = path. ident . name . as_str ( ) ;
3303
- return Some ( ( name, receiver, args, path. ident . span ) ) ;
3303
+ return Some ( ( name, receiver, args, path. ident . span , call_span ) ) ;
3304
3304
}
3305
3305
}
3306
3306
None
@@ -3341,8 +3341,6 @@ impl<'tcx> LateLintPass<'tcx> for Methods {
3341
3341
} ,
3342
3342
_ => ( ) ,
3343
3343
}
3344
-
3345
- needless_collect:: check ( expr, cx) ;
3346
3344
}
3347
3345
3348
3346
#[ allow( clippy:: too_many_lines) ]
@@ -3488,7 +3486,7 @@ impl<'tcx> LateLintPass<'tcx> for Methods {
3488
3486
impl Methods {
3489
3487
#[ allow( clippy:: too_many_lines) ]
3490
3488
fn check_methods < ' tcx > ( & self , cx : & LateContext < ' tcx > , expr : & ' tcx Expr < ' _ > ) {
3491
- if let Some ( ( name, recv, args, span) ) = method_call ( expr) {
3489
+ if let Some ( ( name, recv, args, span, call_span ) ) = method_call ( expr) {
3492
3490
match ( name, args) {
3493
3491
( "add" | "offset" | "sub" | "wrapping_offset" | "wrapping_add" | "wrapping_sub" , [ _arg] ) => {
3494
3492
zst_offset:: check ( cx, expr, recv) ;
@@ -3507,28 +3505,31 @@ impl Methods {
3507
3505
( "as_ref" , [ ] ) => useless_asref:: check ( cx, expr, "as_ref" , recv) ,
3508
3506
( "assume_init" , [ ] ) => uninit_assumed_init:: check ( cx, expr, recv) ,
3509
3507
( "cloned" , [ ] ) => cloned_instead_of_copied:: check ( cx, expr, recv, span, self . msrv ) ,
3510
- ( "collect" , [ ] ) => match method_call ( recv) {
3511
- Some ( ( name @ ( "cloned" | "copied" ) , recv2, [ ] , _) ) => {
3512
- iter_cloned_collect:: check ( cx, name, expr, recv2) ;
3513
- } ,
3514
- Some ( ( "map" , m_recv, [ m_arg] , _) ) => {
3515
- map_collect_result_unit:: check ( cx, expr, m_recv, m_arg, recv) ;
3516
- } ,
3517
- Some ( ( "take" , take_self_arg, [ take_arg] , _) ) => {
3518
- if meets_msrv ( self . msrv , msrvs:: STR_REPEAT ) {
3519
- manual_str_repeat:: check ( cx, expr, recv, take_self_arg, take_arg) ;
3520
- }
3521
- } ,
3522
- _ => { } ,
3508
+ ( "collect" , [ ] ) if is_trait_method ( cx, expr, sym:: Iterator ) => {
3509
+ needless_collect:: check ( cx, span, expr, recv, call_span) ;
3510
+ match method_call ( recv) {
3511
+ Some ( ( name @ ( "cloned" | "copied" ) , recv2, [ ] , _, _) ) => {
3512
+ iter_cloned_collect:: check ( cx, name, expr, recv2) ;
3513
+ } ,
3514
+ Some ( ( "map" , m_recv, [ m_arg] , _, _) ) => {
3515
+ map_collect_result_unit:: check ( cx, expr, m_recv, m_arg) ;
3516
+ } ,
3517
+ Some ( ( "take" , take_self_arg, [ take_arg] , _, _) ) => {
3518
+ if meets_msrv ( self . msrv , msrvs:: STR_REPEAT ) {
3519
+ manual_str_repeat:: check ( cx, expr, recv, take_self_arg, take_arg) ;
3520
+ }
3521
+ } ,
3522
+ _ => { } ,
3523
+ }
3523
3524
} ,
3524
3525
( "count" , [ ] ) if is_trait_method ( cx, expr, sym:: Iterator ) => match method_call ( recv) {
3525
- Some ( ( "cloned" , recv2, [ ] , _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, true , false ) ,
3526
- Some ( ( name2 @ ( "into_iter" | "iter" | "iter_mut" ) , recv2, [ ] , _) ) => {
3526
+ Some ( ( "cloned" , recv2, [ ] , _, _ ) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, true , false ) ,
3527
+ Some ( ( name2 @ ( "into_iter" | "iter" | "iter_mut" ) , recv2, [ ] , _, _ ) ) => {
3527
3528
iter_count:: check ( cx, expr, recv2, name2) ;
3528
3529
} ,
3529
- Some ( ( "map" , _, [ arg] , _) ) => suspicious_map:: check ( cx, expr, recv, arg) ,
3530
- Some ( ( "filter" , recv2, [ arg] , _) ) => bytecount:: check ( cx, expr, recv2, arg) ,
3531
- Some ( ( "bytes" , recv2, [ ] , _) ) => bytes_count_to_len:: check ( cx, expr, recv, recv2) ,
3530
+ Some ( ( "map" , _, [ arg] , _, _ ) ) => suspicious_map:: check ( cx, expr, recv, arg) ,
3531
+ Some ( ( "filter" , recv2, [ arg] , _, _ ) ) => bytecount:: check ( cx, expr, recv2, arg) ,
3532
+ Some ( ( "bytes" , recv2, [ ] , _, _ ) ) => bytes_count_to_len:: check ( cx, expr, recv, recv2) ,
3532
3533
_ => { } ,
3533
3534
} ,
3534
3535
( "drain" , [ arg] ) => {
@@ -3540,8 +3541,8 @@ impl Methods {
3540
3541
}
3541
3542
} ,
3542
3543
( "expect" , [ _] ) => match method_call ( recv) {
3543
- Some ( ( "ok" , recv, [ ] , _) ) => ok_expect:: check ( cx, expr, recv) ,
3544
- Some ( ( "err" , recv, [ ] , err_span) ) => err_expect:: check ( cx, expr, recv, self . msrv , span, err_span) ,
3544
+ Some ( ( "ok" , recv, [ ] , _, _ ) ) => ok_expect:: check ( cx, expr, recv) ,
3545
+ Some ( ( "err" , recv, [ ] , err_span, _ ) ) => err_expect:: check ( cx, expr, recv, self . msrv , span, err_span) ,
3545
3546
_ => expect_used:: check ( cx, expr, recv, false , self . allow_expect_in_tests ) ,
3546
3547
} ,
3547
3548
( "expect_err" , [ _] ) => expect_used:: check ( cx, expr, recv, true , self . allow_expect_in_tests ) ,
@@ -3561,13 +3562,13 @@ impl Methods {
3561
3562
flat_map_option:: check ( cx, expr, arg, span) ;
3562
3563
} ,
3563
3564
( "flatten" , [ ] ) => match method_call ( recv) {
3564
- Some ( ( "map" , recv, [ map_arg] , map_span) ) => map_flatten:: check ( cx, expr, recv, map_arg, map_span) ,
3565
- Some ( ( "cloned" , recv2, [ ] , _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , true ) ,
3565
+ Some ( ( "map" , recv, [ map_arg] , map_span, _ ) ) => map_flatten:: check ( cx, expr, recv, map_arg, map_span) ,
3566
+ Some ( ( "cloned" , recv2, [ ] , _, _ ) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , true ) ,
3566
3567
_ => { } ,
3567
3568
} ,
3568
3569
( "fold" , [ init, acc] ) => unnecessary_fold:: check ( cx, expr, init, acc, span) ,
3569
3570
( "for_each" , [ _] ) => {
3570
- if let Some ( ( "inspect" , _, [ _] , span2) ) = method_call ( recv) {
3571
+ if let Some ( ( "inspect" , _, [ _] , span2, _ ) ) = method_call ( recv) {
3571
3572
inspect_for_each:: check ( cx, expr, span2) ;
3572
3573
}
3573
3574
} ,
@@ -3587,12 +3588,12 @@ impl Methods {
3587
3588
iter_on_single_or_empty_collections:: check ( cx, expr, name, recv) ;
3588
3589
} ,
3589
3590
( "join" , [ join_arg] ) => {
3590
- if let Some ( ( "collect" , _, _, span) ) = method_call ( recv) {
3591
+ if let Some ( ( "collect" , _, _, span, _ ) ) = method_call ( recv) {
3591
3592
unnecessary_join:: check ( cx, expr, recv, join_arg, span) ;
3592
3593
}
3593
3594
} ,
3594
3595
( "last" , [ ] ) | ( "skip" , [ _] ) => {
3595
- if let Some ( ( name2, recv2, args2, _span2) ) = method_call ( recv) {
3596
+ if let Some ( ( name2, recv2, args2, _span2, _ ) ) = method_call ( recv) {
3596
3597
if let ( "cloned" , [ ] ) = ( name2, args2) {
3597
3598
iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ;
3598
3599
}
@@ -3604,13 +3605,13 @@ impl Methods {
3604
3605
( name @ ( "map" | "map_err" ) , [ m_arg] ) => {
3605
3606
if name == "map" {
3606
3607
map_clone:: check ( cx, expr, recv, m_arg, self . msrv ) ;
3607
- if let Some ( ( map_name @ ( "iter" | "into_iter" ) , recv2, _, _) ) = method_call ( recv) {
3608
+ if let Some ( ( map_name @ ( "iter" | "into_iter" ) , recv2, _, _, _ ) ) = method_call ( recv) {
3608
3609
iter_kv_map:: check ( cx, map_name, expr, recv2, m_arg) ;
3609
3610
}
3610
3611
} else {
3611
3612
map_err_ignore:: check ( cx, expr, m_arg) ;
3612
3613
}
3613
- if let Some ( ( name, recv2, args, span2) ) = method_call ( recv) {
3614
+ if let Some ( ( name, recv2, args, span2, _ ) ) = method_call ( recv) {
3614
3615
match ( name, args) {
3615
3616
( "as_mut" , [ ] ) => option_as_ref_deref:: check ( cx, expr, recv2, m_arg, true , self . msrv ) ,
3616
3617
( "as_ref" , [ ] ) => option_as_ref_deref:: check ( cx, expr, recv2, m_arg, false , self . msrv ) ,
@@ -3630,7 +3631,7 @@ impl Methods {
3630
3631
manual_ok_or:: check ( cx, expr, recv, def, map) ;
3631
3632
} ,
3632
3633
( "next" , [ ] ) => {
3633
- if let Some ( ( name2, recv2, args2, _) ) = method_call ( recv) {
3634
+ if let Some ( ( name2, recv2, args2, _, _ ) ) = method_call ( recv) {
3634
3635
match ( name2, args2) {
3635
3636
( "cloned" , [ ] ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ,
3636
3637
( "filter" , [ arg] ) => filter_next:: check ( cx, expr, recv2, arg) ,
@@ -3643,10 +3644,10 @@ impl Methods {
3643
3644
}
3644
3645
} ,
3645
3646
( "nth" , [ n_arg] ) => match method_call ( recv) {
3646
- Some ( ( "bytes" , recv2, [ ] , _) ) => bytes_nth:: check ( cx, expr, recv2, n_arg) ,
3647
- Some ( ( "cloned" , recv2, [ ] , _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ,
3648
- Some ( ( "iter" , recv2, [ ] , _) ) => iter_nth:: check ( cx, expr, recv2, recv, n_arg, false ) ,
3649
- Some ( ( "iter_mut" , recv2, [ ] , _) ) => iter_nth:: check ( cx, expr, recv2, recv, n_arg, true ) ,
3647
+ Some ( ( "bytes" , recv2, [ ] , _, _ ) ) => bytes_nth:: check ( cx, expr, recv2, n_arg) ,
3648
+ Some ( ( "cloned" , recv2, [ ] , _, _ ) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ,
3649
+ Some ( ( "iter" , recv2, [ ] , _, _ ) ) => iter_nth:: check ( cx, expr, recv2, recv, n_arg, false ) ,
3650
+ Some ( ( "iter_mut" , recv2, [ ] , _, _ ) ) => iter_nth:: check ( cx, expr, recv2, recv, n_arg, true ) ,
3650
3651
_ => iter_nth_zero:: check ( cx, expr, recv, n_arg) ,
3651
3652
} ,
3652
3653
( "ok_or_else" , [ arg] ) => unnecessary_lazy_eval:: check ( cx, expr, recv, arg, "ok_or" ) ,
@@ -3711,7 +3712,7 @@ impl Methods {
3711
3712
} ,
3712
3713
( "step_by" , [ arg] ) => iterator_step_by_zero:: check ( cx, expr, arg) ,
3713
3714
( "take" , [ _arg] ) => {
3714
- if let Some ( ( name2, recv2, args2, _span2) ) = method_call ( recv) {
3715
+ if let Some ( ( name2, recv2, args2, _span2, _ ) ) = method_call ( recv) {
3715
3716
if let ( "cloned" , [ ] ) = ( name2, args2) {
3716
3717
iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ;
3717
3718
}
@@ -3734,13 +3735,13 @@ impl Methods {
3734
3735
} ,
3735
3736
( "unwrap" , [ ] ) => {
3736
3737
match method_call ( recv) {
3737
- Some ( ( "get" , recv, [ get_arg] , _) ) => {
3738
+ Some ( ( "get" , recv, [ get_arg] , _, _ ) ) => {
3738
3739
get_unwrap:: check ( cx, expr, recv, get_arg, false ) ;
3739
3740
} ,
3740
- Some ( ( "get_mut" , recv, [ get_arg] , _) ) => {
3741
+ Some ( ( "get_mut" , recv, [ get_arg] , _, _ ) ) => {
3741
3742
get_unwrap:: check ( cx, expr, recv, get_arg, true ) ;
3742
3743
} ,
3743
- Some ( ( "or" , recv, [ or_arg] , or_span) ) => {
3744
+ Some ( ( "or" , recv, [ or_arg] , or_span, _ ) ) => {
3744
3745
or_then_unwrap:: check ( cx, expr, recv, or_arg, or_span) ;
3745
3746
} ,
3746
3747
_ => { } ,
@@ -3749,19 +3750,19 @@ impl Methods {
3749
3750
} ,
3750
3751
( "unwrap_err" , [ ] ) => unwrap_used:: check ( cx, expr, recv, true , self . allow_unwrap_in_tests ) ,
3751
3752
( "unwrap_or" , [ u_arg] ) => match method_call ( recv) {
3752
- Some ( ( arith @ ( "checked_add" | "checked_sub" | "checked_mul" ) , lhs, [ rhs] , _) ) => {
3753
+ Some ( ( arith @ ( "checked_add" | "checked_sub" | "checked_mul" ) , lhs, [ rhs] , _, _ ) ) => {
3753
3754
manual_saturating_arithmetic:: check ( cx, expr, lhs, rhs, u_arg, & arith[ "checked_" . len ( ) ..] ) ;
3754
3755
} ,
3755
- Some ( ( "map" , m_recv, [ m_arg] , span) ) => {
3756
+ Some ( ( "map" , m_recv, [ m_arg] , span, _ ) ) => {
3756
3757
option_map_unwrap_or:: check ( cx, expr, m_recv, m_arg, recv, u_arg, span) ;
3757
3758
} ,
3758
- Some ( ( "then_some" , t_recv, [ t_arg] , _) ) => {
3759
+ Some ( ( "then_some" , t_recv, [ t_arg] , _, _ ) ) => {
3759
3760
obfuscated_if_else:: check ( cx, expr, t_recv, t_arg, u_arg) ;
3760
3761
} ,
3761
3762
_ => { } ,
3762
3763
} ,
3763
3764
( "unwrap_or_else" , [ u_arg] ) => match method_call ( recv) {
3764
- Some ( ( "map" , recv, [ map_arg] , _) )
3765
+ Some ( ( "map" , recv, [ map_arg] , _, _ ) )
3765
3766
if map_unwrap_or:: check ( cx, expr, recv, map_arg, u_arg, self . msrv ) => { } ,
3766
3767
_ => {
3767
3768
unwrap_or_else_default:: check ( cx, expr, recv, u_arg) ;
@@ -3782,7 +3783,7 @@ impl Methods {
3782
3783
}
3783
3784
3784
3785
fn check_is_some_is_none ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > , recv : & Expr < ' _ > , is_some : bool ) {
3785
- if let Some ( ( name @ ( "find" | "position" | "rposition" ) , f_recv, [ arg] , span) ) = method_call ( recv) {
3786
+ if let Some ( ( name @ ( "find" | "position" | "rposition" ) , f_recv, [ arg] , span, _ ) ) = method_call ( recv) {
3786
3787
search_is_some:: check ( cx, expr, name, is_some, f_recv, arg, recv, span) ;
3787
3788
}
3788
3789
}
0 commit comments