Skip to content

Commit 1dcef1a

Browse files
CodeMan62ntBreCodeMan62
authored
[perflint] Parenthesize generator expressions (PERF401) (#19325)
## Summary closes #19204 ## Test Plan 1. test case is added in dedicated file 2. locally tested the code manually --------- Co-authored-by: Brent Westbrook <[email protected]> Co-authored-by: CodeMan62 <[email protected]>
1 parent ba629fe commit 1dcef1a

File tree

4 files changed

+88
-1
lines changed

4 files changed

+88
-1
lines changed

crates/ruff_linter/resources/test/fixtures/perflint/PERF401.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,15 @@ def f():
278278
for i in src:
279279
if lambda: 0:
280280
dst.append(i)
281+
282+
def f():
283+
i = "xyz"
284+
result = []
285+
for i in range(3):
286+
result.append(x for x in [i])
287+
288+
def f():
289+
i = "xyz"
290+
result = []
291+
for i in range(3):
292+
result.append((x for x in [i]))

crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,14 @@ fn convert_to_list_extend(
406406
};
407407
let target_str = locator.slice(for_stmt.target.range());
408408
let elt_str = locator.slice(to_append);
409-
let generator_str = format!("{elt_str} {for_type} {target_str} in {for_iter_str}{if_str}");
409+
let generator_str = if to_append
410+
.as_generator_expr()
411+
.is_some_and(|generator| !generator.parenthesized)
412+
{
413+
format!("({elt_str}) {for_type} {target_str} in {for_iter_str}{if_str}")
414+
} else {
415+
format!("{elt_str} {for_type} {target_str} in {for_iter_str}{if_str}")
416+
};
410417

411418
let variable_name = locator.slice(binding);
412419
let for_loop_inline_comments = comment_strings_in_range(

crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__PERF401_PERF401.py.snap

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,5 +241,27 @@ PERF401.py:280:13: PERF401 Use `list.extend` to create a transformed list
241241
279 | if lambda: 0:
242242
280 | dst.append(i)
243243
| ^^^^^^^^^^^^^ PERF401
244+
281 |
245+
282 | def f():
244246
|
245247
= help: Replace for loop with list.extend
248+
249+
PERF401.py:286:9: PERF401 Use a list comprehension to create a transformed list
250+
|
251+
284 | result = []
252+
285 | for i in range(3):
253+
286 | result.append(x for x in [i])
254+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PERF401
255+
287 |
256+
288 | def f():
257+
|
258+
= help: Replace for loop with list comprehension
259+
260+
PERF401.py:292:9: PERF401 Use a list comprehension to create a transformed list
261+
|
262+
290 | result = []
263+
291 | for i in range(3):
264+
292 | result.append((x for x in [i]))
265+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PERF401
266+
|
267+
= help: Replace for loop with list comprehension

crates/ruff_linter/src/rules/perflint/snapshots/ruff_linter__rules__perflint__tests__preview__PERF401_PERF401.py.snap

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,8 @@ PERF401.py:280:13: PERF401 [*] Use `list.extend` to create a transformed list
566566
279 | if lambda: 0:
567567
280 | dst.append(i)
568568
| ^^^^^^^^^^^^^ PERF401
569+
281 |
570+
282 | def f():
569571
|
570572
= help: Replace for loop with list.extend
571573

@@ -577,3 +579,47 @@ PERF401.py:280:13: PERF401 [*] Use `list.extend` to create a transformed list
577579
279 |- if lambda: 0:
578580
280 |- dst.append(i)
579581
278 |+ dst.extend(i for i in src if (lambda: 0))
582+
281 279 |
583+
282 280 | def f():
584+
283 281 | i = "xyz"
585+
586+
PERF401.py:286:9: PERF401 [*] Use a list comprehension to create a transformed list
587+
|
588+
284 | result = []
589+
285 | for i in range(3):
590+
286 | result.append(x for x in [i])
591+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PERF401
592+
287 |
593+
288 | def f():
594+
|
595+
= help: Replace for loop with list comprehension
596+
597+
Unsafe fix
598+
281 281 |
599+
282 282 | def f():
600+
283 283 | i = "xyz"
601+
284 |- result = []
602+
285 |- for i in range(3):
603+
286 |- result.append(x for x in [i])
604+
284 |+ result = [(x for x in [i]) for i in range(3)]
605+
287 285 |
606+
288 286 | def f():
607+
289 287 | i = "xyz"
608+
609+
PERF401.py:292:9: PERF401 [*] Use a list comprehension to create a transformed list
610+
|
611+
290 | result = []
612+
291 | for i in range(3):
613+
292 | result.append((x for x in [i]))
614+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PERF401
615+
|
616+
= help: Replace for loop with list comprehension
617+
618+
Unsafe fix
619+
287 287 |
620+
288 288 | def f():
621+
289 289 | i = "xyz"
622+
290 |- result = []
623+
291 |- for i in range(3):
624+
292 |- result.append((x for x in [i]))
625+
290 |+ result = [(x for x in [i]) for i in range(3)]

0 commit comments

Comments
 (0)