@@ -10,7 +10,7 @@ use rustc_data_structures::fx::FxIndexSet;
10
10
use rustc_hir:: intravisit:: { Visitor , walk_expr} ;
11
11
12
12
use 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 } ;
14
14
use rustc_lint:: { LateContext , LateLintPass , LintContext } ;
15
15
use rustc_middle:: ty;
16
16
use rustc_session:: declare_lint_pass;
@@ -350,12 +350,24 @@ impl<'tcx> IndexBinding<'_, 'tcx> {
350
350
format ! ( "{lhs_snippet}{rhs_snippet}" )
351
351
} ,
352
352
ExprKind :: Path ( QPath :: Resolved ( _, path) ) => {
353
- let init = self . cx . expr_or_init ( expr) ;
354
-
355
353
let Some ( first_segment) = path. segments . first ( ) else {
356
354
return String :: new ( ) ;
357
355
} ;
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
+ {
359
371
return String :: new ( ) ;
360
372
}
361
373
@@ -371,6 +383,21 @@ impl<'tcx> IndexBinding<'_, 'tcx> {
371
383
}
372
384
}
373
385
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
+
374
401
fn is_used_other_than_swapping ( & mut self , idx_ident : Ident ) -> bool {
375
402
if Self :: is_used_slice_indexed ( self . swap1_idx , idx_ident)
376
403
|| Self :: is_used_slice_indexed ( self . swap2_idx , idx_ident)
0 commit comments