diff --git a/crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py b/crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py index a1c071c8ac6dbb..ad92de80ad0949 100644 --- a/crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py +++ b/crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py @@ -244,3 +244,10 @@ def g(): for a in values: result.append(a + 1) # PERF401 result = [] + +def f(): + values = [1, 2, 3] + result = [] + for i in values: + result.append(i + 1) # Ok + del i diff --git a/crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs b/crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs index 606c759727785e..e7f57944fa7c99 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs @@ -237,31 +237,12 @@ pub(crate) fn manual_list_comprehension(checker: &mut Checker, for_stmt: &ast::S // filtered = [x for x in y] // print(x) // ``` - let last_target_binding = checker + let target_binding = checker .semantic() - .lookup_symbol(for_stmt_target_id) - .expect("for loop target must exist"); - - let target_binding = { - let mut bindings = [last_target_binding].into_iter().chain( - checker - .semantic() - .shadowed_bindings(checker.semantic().scope_id, last_target_binding) - .filter_map(|shadowed| shadowed.same_scope().then_some(shadowed.shadowed_id())), - ); - - bindings - .find_map(|binding_id| { - let binding = checker.semantic().binding(binding_id); - binding - .statement(checker.semantic()) - .and_then(ast::Stmt::as_for_stmt) - .is_some_and(|stmt| stmt.range == for_stmt.range) - .then_some(binding) - }) - .expect("for target binding must exist") - }; - + .bindings + .iter() + .find(|binding| for_stmt.target.range() == binding.range) + .unwrap(); // If any references to the loop target variable are after the loop, // then converting it into a comprehension would cause a NameError if target_binding diff --git a/crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__preview__PERF401_PERF401.py.snap b/crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__preview__PERF401_PERF401.py.snap index e22129c2309d57..83b2cf55f04685 100644 --- a/crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__preview__PERF401_PERF401.py.snap +++ b/crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__preview__PERF401_PERF401.py.snap @@ -484,3 +484,5 @@ PERF401.py:245:13: PERF401 [*] Use `list.extend` to create a transformed list 245 |- result.append(a + 1) # PERF401 244 |+ result.extend(a + 1 for a in values) # PERF401 246 245 | result = [] +247 246 | +248 247 | def f():