[parser] Flag single unparenthesized generator expr with trailing comma in arguments. (#17893)

Fixes #17867

## Summary

The CPython parser does not allow generator expressions which are the
sole arguments in an argument list to have a trailing comma.
With this change, we start flagging such instances.

## Test Plan

Added new inline tests.
This commit is contained in:
Abhijeet Prasad Bodas 2025-05-07 23:41:35 +05:30 committed by GitHub
parent 895b6161a6
commit f5096f2050
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 426 additions and 124 deletions

View file

@ -1,14 +1,13 @@
---
source: crates/ruff_python_parser/tests/fixtures.rs
input_file: crates/ruff_python_parser/resources/inline/err/args_unparenthesized_generator.py
snapshot_kind: text
---
## AST
```
Module(
ModModule {
range: 0..65,
range: 0..92,
body: [
Expr(
StmtExpr {
@ -194,6 +193,82 @@ Module(
),
},
),
Expr(
StmtExpr {
range: 65..91,
value: Call(
ExprCall {
range: 65..91,
func: Name(
ExprName {
range: 65..68,
id: Name("sum"),
ctx: Load,
},
),
arguments: Arguments {
range: 68..91,
args: [
Generator(
ExprGenerator {
range: 69..89,
elt: Name(
ExprName {
range: 69..70,
id: Name("x"),
ctx: Load,
},
),
generators: [
Comprehension {
range: 71..89,
target: Name(
ExprName {
range: 75..76,
id: Name("x"),
ctx: Store,
},
),
iter: Call(
ExprCall {
range: 80..89,
func: Name(
ExprName {
range: 80..85,
id: Name("range"),
ctx: Load,
},
),
arguments: Arguments {
range: 85..89,
args: [
NumberLiteral(
ExprNumberLiteral {
range: 86..88,
value: Int(
10,
),
},
),
],
keywords: [],
},
},
),
ifs: [],
is_async: false,
},
],
parenthesized: false,
},
),
],
keywords: [],
},
},
),
},
),
],
},
)
@ -204,6 +279,7 @@ Module(
1 | sum(x for x in range(10), 5)
| ^^^^^^^^^^^^^^^^^^^^ Syntax Error: Unparenthesized generator expression cannot be used here
2 | total(1, 2, x for x in range(5), 6)
3 | sum(x for x in range(10),)
|
@ -211,4 +287,13 @@ Module(
1 | sum(x for x in range(10), 5)
2 | total(1, 2, x for x in range(5), 6)
| ^^^^^^^^^^^^^^^^^^^ Syntax Error: Unparenthesized generator expression cannot be used here
3 | sum(x for x in range(10),)
|
|
1 | sum(x for x in range(10), 5)
2 | total(1, 2, x for x in range(5), 6)
3 | sum(x for x in range(10),)
| ^^^^^^^^^^^^^^^^^^^^ Syntax Error: Unparenthesized generator expression cannot be used here
|

View file

@ -1,67 +1,195 @@
---
source: crates/ruff_python_parser/tests/fixtures.rs
input_file: crates/ruff_python_parser/resources/inline/ok/args_unparenthesized_generator.py
snapshot_kind: text
---
## AST
```
Module(
ModModule {
range: 0..26,
range: 0..107,
body: [
Expr(
StmtExpr {
range: 0..25,
range: 0..51,
value: Call(
ExprCall {
range: 0..25,
range: 0..51,
func: Name(
ExprName {
range: 0..3,
id: Name("sum"),
id: Name("zip"),
ctx: Load,
},
),
arguments: Arguments {
range: 3..25,
range: 3..51,
args: [
Generator(
ExprGenerator {
range: 4..24,
range: 4..26,
elt: Name(
ExprName {
range: 4..5,
range: 5..6,
id: Name("x"),
ctx: Load,
},
),
generators: [
Comprehension {
range: 6..24,
range: 7..25,
target: Name(
ExprName {
range: 10..11,
range: 11..12,
id: Name("x"),
ctx: Store,
},
),
iter: Call(
ExprCall {
range: 15..24,
range: 16..25,
func: Name(
ExprName {
range: 15..20,
range: 16..21,
id: Name("range"),
ctx: Load,
},
),
arguments: Arguments {
range: 20..24,
range: 21..25,
args: [
NumberLiteral(
ExprNumberLiteral {
range: 21..23,
range: 22..24,
value: Int(
10,
),
},
),
],
keywords: [],
},
},
),
ifs: [],
is_async: false,
},
],
parenthesized: true,
},
),
Generator(
ExprGenerator {
range: 28..50,
elt: Name(
ExprName {
range: 29..30,
id: Name("y"),
ctx: Load,
},
),
generators: [
Comprehension {
range: 31..49,
target: Name(
ExprName {
range: 35..36,
id: Name("y"),
ctx: Store,
},
),
iter: Call(
ExprCall {
range: 40..49,
func: Name(
ExprName {
range: 40..45,
id: Name("range"),
ctx: Load,
},
),
arguments: Arguments {
range: 45..49,
args: [
NumberLiteral(
ExprNumberLiteral {
range: 46..48,
value: Int(
10,
),
},
),
],
keywords: [],
},
},
),
ifs: [],
is_async: false,
},
],
parenthesized: true,
},
),
],
keywords: [],
},
},
),
},
),
Expr(
StmtExpr {
range: 52..77,
value: Call(
ExprCall {
range: 52..77,
func: Name(
ExprName {
range: 52..55,
id: Name("sum"),
ctx: Load,
},
),
arguments: Arguments {
range: 55..77,
args: [
Generator(
ExprGenerator {
range: 56..76,
elt: Name(
ExprName {
range: 56..57,
id: Name("x"),
ctx: Load,
},
),
generators: [
Comprehension {
range: 58..76,
target: Name(
ExprName {
range: 62..63,
id: Name("x"),
ctx: Store,
},
),
iter: Call(
ExprCall {
range: 67..76,
func: Name(
ExprName {
range: 67..72,
id: Name("range"),
ctx: Load,
},
),
arguments: Arguments {
range: 72..76,
args: [
NumberLiteral(
ExprNumberLiteral {
range: 73..75,
value: Int(
10,
),
@ -86,6 +214,82 @@ Module(
),
},
),
Expr(
StmtExpr {
range: 78..106,
value: Call(
ExprCall {
range: 78..106,
func: Name(
ExprName {
range: 78..81,
id: Name("sum"),
ctx: Load,
},
),
arguments: Arguments {
range: 81..106,
args: [
Generator(
ExprGenerator {
range: 82..104,
elt: Name(
ExprName {
range: 83..84,
id: Name("x"),
ctx: Load,
},
),
generators: [
Comprehension {
range: 85..103,
target: Name(
ExprName {
range: 89..90,
id: Name("x"),
ctx: Store,
},
),
iter: Call(
ExprCall {
range: 94..103,
func: Name(
ExprName {
range: 94..99,
id: Name("range"),
ctx: Load,
},
),
arguments: Arguments {
range: 99..103,
args: [
NumberLiteral(
ExprNumberLiteral {
range: 100..102,
value: Int(
10,
),
},
),
],
keywords: [],
},
},
),
ifs: [],
is_async: false,
},
],
parenthesized: true,
},
),
],
keywords: [],
},
},
),
},
),
],
},
)