@@ -3,40 +3,27 @@ use clippy_utils::diagnostics::{multispan_sugg, span_lint_and_then};
33use clippy_utils:: source:: snippet;
44use clippy_utils:: sugg;
55use clippy_utils:: visitors:: is_local_used;
6+ use rustc_hir:: def:: DefKind ;
67use rustc_hir:: { Expr , ExprKind , Pat , PatKind } ;
78use rustc_lint:: LateContext ;
89use rustc_middle:: ty;
910
1011/// Checks for the `UNUSED_ENUMERATE_INDEX` lint.
1112pub ( super ) fn check < ' tcx > ( cx : & LateContext < ' tcx > , pat : & ' tcx Pat < ' _ > , arg : & ' tcx Expr < ' _ > , body : & ' tcx Expr < ' _ > ) {
12- let pat_span = pat. span ;
13-
14- let PatKind :: Tuple ( pat, _) = pat. kind else {
13+ let PatKind :: Tuple ( tuple, _) = pat. kind else {
1514 return ;
1615 } ;
1716
18- if pat. len ( ) != 2 {
19- return ;
20- }
21-
22- let arg_span = arg. span ;
23-
24- let ExprKind :: MethodCall ( method, self_arg, [ ] , _) = arg. kind else {
17+ let ExprKind :: MethodCall ( _method, self_arg, [ ] , _) = arg. kind else {
2518 return ;
2619 } ;
2720
28- if method. ident . as_str ( ) != "enumerate" {
29- return ;
30- }
31-
3221 let ty = cx. typeck_results ( ) . expr_ty ( arg) ;
3322
34- if !pat_is_wild ( cx, & pat [ 0 ] . kind , body) {
23+ if !pat_is_wild ( cx, & tuple [ 0 ] . kind , body) {
3524 return ;
3625 }
3726
38- let new_pat_span = pat[ 1 ] . span ;
39-
4027 let name = match * ty. kind ( ) {
4128 ty:: Adt ( base, _substs) => cx. tcx . def_path_str ( base. did ( ) ) ,
4229 _ => return ,
@@ -46,19 +33,29 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, pat: &'tcx Pat<'_>, arg: &'tcx
4633 return ;
4734 }
4835
36+ let Some ( ( DefKind :: AssocFn , call_id) ) = cx. typeck_results ( ) . type_dependent_def ( arg. hir_id ) else {
37+ return ;
38+ } ;
39+
40+ let call_name = cx. tcx . def_path_str ( call_id) ;
41+
42+ if call_name != "std::iter::Iterator::enumerate" && call_name != "core::iter::Iterator::enumerate" {
43+ return ;
44+ }
45+
4946 span_lint_and_then (
5047 cx,
5148 UNUSED_ENUMERATE_INDEX ,
52- arg_span ,
49+ arg . span ,
5350 "you seem to use `.enumerate()` and immediately discard the index" ,
5451 |diag| {
5552 let base_iter = sugg:: Sugg :: hir ( cx, self_arg, "base iter" ) ;
5653 multispan_sugg (
5754 diag,
5855 "remove the `.enumerate()` call" ,
5956 vec ! [
60- ( pat_span , snippet( cx, new_pat_span , "value " ) . into_owned( ) ) ,
61- ( arg_span , base_iter. to_string( ) ) ,
57+ ( pat . span , snippet( cx, tuple [ 1 ] . span , ".. " ) . into_owned( ) ) ,
58+ ( arg . span , base_iter. to_string( ) ) ,
6259 ] ,
6360 ) ;
6461 } ,
0 commit comments