@@ -10,7 +10,7 @@ use rustc_data_structures::fx::FxIndexSet;
1010use  rustc_hir:: intravisit:: { Visitor ,  walk_expr} ; 
1111
1212use  rustc_errors:: Applicability ; 
13- use  rustc_hir:: { AssignOpKind ,  Block ,  Expr ,  ExprKind ,  LetStmt ,  PatKind ,  QPath ,  Stmt ,  StmtKind } ; 
13+ use  rustc_hir:: { AssignOpKind ,  Block ,  Expr ,  ExprKind ,  LetStmt ,  PatKind ,  Path ,   QPath ,  Stmt ,  StmtKind } ; 
1414use  rustc_lint:: { LateContext ,  LateLintPass ,  LintContext } ; 
1515use  rustc_middle:: ty; 
1616use  rustc_session:: declare_lint_pass; 
@@ -350,12 +350,24 @@ impl<'tcx> IndexBinding<'_, 'tcx> {
350350                format ! ( "{lhs_snippet}{rhs_snippet}" ) 
351351            } , 
352352            ExprKind :: Path ( QPath :: Resolved ( _,  path) )  => { 
353-                 let  init = self . cx . expr_or_init ( expr) ; 
354- 
355353                let  Some ( first_segment)  = path. segments . first ( )  else  { 
356354                    return  String :: new ( ) ; 
357355                } ; 
358-                 if  !self . suggest_span . contains ( init. span )  || !self . is_used_other_than_swapping ( first_segment. ident )  { 
356+ 
357+                 let  init = self . cx . expr_or_init ( expr) ; 
358+ 
359+                 // We skip suggesting a variable binding in any of these cases: 
360+                 // 1. Variable initialization is outside the suggestion span 
361+                 // 2. Variable initialization is inside the suggestion span but the variable is not used as an index 
362+                 //    or elsewhere later 
363+                 // 3. Variable initialization is inside the suggestion span and the variable is used as an 
364+                 //    index/elsewhere later, but its declaration is outside the suggestion span 
365+                 if  !self . suggest_span . contains ( init. span ) 
366+                     || !self . is_used_other_than_swapping ( first_segment. ident ) 
367+                     || self 
368+                         . get_res_span ( expr) 
369+                         . is_some_and ( |span| !self . suggest_span . contains ( span) ) 
370+                 { 
359371                    return  String :: new ( ) ; 
360372                } 
361373
@@ -371,6 +383,21 @@ impl<'tcx> IndexBinding<'_, 'tcx> {
371383        } 
372384    } 
373385
386+     fn  get_res_span ( & self ,  expr :  & ' tcx  Expr < ' tcx > )  -> Option < Span >  { 
387+         if  let  ExprKind :: Path ( QPath :: Resolved ( 
388+             _, 
389+             Path  { 
390+                 res :  rustc_hir:: def:: Res :: Local ( hir_id) , 
391+                 ..
392+             } , 
393+         ) )  = expr. kind 
394+         { 
395+             Some ( self . cx . tcx . hir_span ( * hir_id) ) 
396+         }  else  { 
397+             None 
398+         } 
399+     } 
400+ 
374401    fn  is_used_other_than_swapping ( & mut  self ,  idx_ident :  Ident )  -> bool  { 
375402        if  Self :: is_used_slice_indexed ( self . swap1_idx ,  idx_ident) 
376403            || Self :: is_used_slice_indexed ( self . swap2_idx ,  idx_ident) 
0 commit comments