diff --git a/crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py b/crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py index 880ca4c09a091..aba71a26f366f 100644 --- a/crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py +++ b/crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py @@ -278,3 +278,15 @@ def f(): for i in src: if lambda: 0: dst.append(i) + +def f(): + i = "xyz" + result = [] + for i in range(3): + result.append(x for x in [i]) + +def f(): + i = "xyz" + result = [] + for i in range(3): + result.append((x for x in [i])) \ No newline at end of file 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 058de22939bf2..66988f9292a49 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 @@ -406,7 +406,14 @@ fn convert_to_list_extend( }; let target_str = locator.slice(for_stmt.target.range()); let elt_str = locator.slice(to_append); - let generator_str = format!("{elt_str} {for_type} {target_str} in {for_iter_str}{if_str}"); + let generator_str = if to_append + .as_generator_expr() + .is_some_and(|generator| !generator.parenthesized) + { + format!("({elt_str}) {for_type} {target_str} in {for_iter_str}{if_str}") + } else { + format!("{elt_str} {for_type} {target_str} in {for_iter_str}{if_str}") + }; let variable_name = locator.slice(binding); let for_loop_inline_comments = comment_strings_in_range( diff --git a/crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__PERF401_PERF401.py.snap b/crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__PERF401_PERF401.py.snap index d451379bcf5ec..de479f0f02ecc 100644 --- a/crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__PERF401_PERF401.py.snap +++ b/crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__PERF401_PERF401.py.snap @@ -241,5 +241,27 @@ PERF401.py:280:13: PERF401 Use `list.extend` to create a transformed list 279 | if lambda: 0: 280 | dst.append(i) | ^^^^^^^^^^^^^ PERF401 +281 | +282 | def f(): | = help: Replace for loop with list.extend + +PERF401.py:286:9: PERF401 Use a list comprehension to create a transformed list + | +284 | result = [] +285 | for i in range(3): +286 | result.append(x for x in [i]) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PERF401 +287 | +288 | def f(): + | + = help: Replace for loop with list comprehension + +PERF401.py:292:9: PERF401 Use a list comprehension to create a transformed list + | +290 | result = [] +291 | for i in range(3): +292 | result.append((x for x in [i])) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PERF401 + | + = help: Replace for loop with list comprehension 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 d5b614bfe98bb..b5ea056c83c69 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 @@ -566,6 +566,8 @@ PERF401.py:280:13: PERF401 [*] Use `list.extend` to create a transformed list 279 | if lambda: 0: 280 | dst.append(i) | ^^^^^^^^^^^^^ PERF401 +281 | +282 | def f(): | = help: Replace for loop with list.extend @@ -577,3 +579,47 @@ PERF401.py:280:13: PERF401 [*] Use `list.extend` to create a transformed list 279 |- if lambda: 0: 280 |- dst.append(i) 278 |+ dst.extend(i for i in src if (lambda: 0)) +281 279 | +282 280 | def f(): +283 281 | i = "xyz" + +PERF401.py:286:9: PERF401 [*] Use a list comprehension to create a transformed list + | +284 | result = [] +285 | for i in range(3): +286 | result.append(x for x in [i]) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PERF401 +287 | +288 | def f(): + | + = help: Replace for loop with list comprehension + +ℹ Unsafe fix +281 281 | +282 282 | def f(): +283 283 | i = "xyz" +284 |- result = [] +285 |- for i in range(3): +286 |- result.append(x for x in [i]) + 284 |+ result = [(x for x in [i]) for i in range(3)] +287 285 | +288 286 | def f(): +289 287 | i = "xyz" + +PERF401.py:292:9: PERF401 [*] Use a list comprehension to create a transformed list + | +290 | result = [] +291 | for i in range(3): +292 | result.append((x for x in [i])) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PERF401 + | + = help: Replace for loop with list comprehension + +ℹ Unsafe fix +287 287 | +288 288 | def f(): +289 289 | i = "xyz" +290 |- result = [] +291 |- for i in range(3): +292 |- result.append((x for x in [i])) + 290 |+ result = [(x for x in [i]) for i in range(3)]