ruff/crates/ruff_python_parser/tests/snapshots/valid_syntax@expressions__lambda.py.snap
Dhruv Manilawala 13ffb5bc19
Replace LALRPOP parser with hand-written parser (#10036)
(Supersedes #9152, authored by @LaBatata101)

## Summary

This PR replaces the current parser generated from LALRPOP to a
hand-written recursive descent parser.

It also updates the grammar for [PEP
646](https://peps.python.org/pep-0646/) so that the parser outputs the
correct AST. For example, in `data[*x]`, the index expression is now a
tuple with a single starred expression instead of just a starred
expression.

Beyond the performance improvements, the parser is also error resilient
and can provide better error messages. The behavior as seen by any
downstream tools isn't changed. That is, the linter and formatter can
still assume that the parser will _stop_ at the first syntax error. This
will be updated in the following months.

For more details about the change here, refer to the PR corresponding to
the individual commits and the release blog post.

## Test Plan

Write _lots_ and _lots_ of tests for both valid and invalid syntax and
verify the output.

## Acknowledgements

- @MichaReiser for reviewing 100+ parser PRs and continuously providing
guidance throughout the project
- @LaBatata101 for initiating the transition to a hand-written parser in
#9152
- @addisoncrump for implementing the fuzzer which helped
[catch](https://github.com/astral-sh/ruff/pull/10903)
[a](https://github.com/astral-sh/ruff/pull/10910)
[lot](https://github.com/astral-sh/ruff/pull/10966)
[of](https://github.com/astral-sh/ruff/pull/10896)
[bugs](https://github.com/astral-sh/ruff/pull/10877)

---------

Co-authored-by: Victor Hugo Gomes <labatata101@linuxmail.org>
Co-authored-by: Micha Reiser <micha@reiser.io>
2024-04-18 17:57:39 +05:30

1521 lines
74 KiB
Text

---
source: crates/ruff_python_parser/tests/fixtures.rs
input_file: crates/ruff_python_parser/resources/valid/expressions/lambda.py
---
## AST
```
Module(
ModModule {
range: 0..530,
body: [
Expr(
StmtExpr {
range: 0..9,
value: Lambda(
ExprLambda {
range: 0..9,
parameters: None,
body: Name(
ExprName {
range: 8..9,
id: "a",
ctx: Load,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 10..19,
value: Lambda(
ExprLambda {
range: 10..19,
parameters: None,
body: NumberLiteral(
ExprNumberLiteral {
range: 18..19,
value: Int(
1,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 20..31,
value: Lambda(
ExprLambda {
range: 20..31,
parameters: Some(
Parameters {
range: 27..28,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 27..28,
parameter: Parameter {
range: 27..28,
name: Identifier {
id: "x",
range: 27..28,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 30..31,
value: Int(
1,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 32..48,
value: Lambda(
ExprLambda {
range: 32..48,
parameters: Some(
Parameters {
range: 39..43,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 39..40,
parameter: Parameter {
range: 39..40,
name: Identifier {
id: "x",
range: 39..40,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 42..43,
parameter: Parameter {
range: 42..43,
name: Identifier {
id: "y",
range: 42..43,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: EllipsisLiteral(
ExprEllipsisLiteral {
range: 45..48,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 49..66,
value: Lambda(
ExprLambda {
range: 49..66,
parameters: Some(
Parameters {
range: 56..63,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 56..57,
parameter: Parameter {
range: 56..57,
name: Identifier {
id: "a",
range: 56..57,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 59..60,
parameter: Parameter {
range: 59..60,
name: Identifier {
id: "b",
range: 59..60,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 62..63,
parameter: Parameter {
range: 62..63,
name: Identifier {
id: "c",
range: 62..63,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 65..66,
value: Int(
1,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 67..90,
value: Lambda(
ExprLambda {
range: 67..90,
parameters: Some(
Parameters {
range: 74..87,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 74..75,
parameter: Parameter {
range: 74..75,
name: Identifier {
id: "a",
range: 74..75,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 77..81,
parameter: Parameter {
range: 77..78,
name: Identifier {
id: "b",
range: 77..78,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 79..81,
value: Int(
20,
),
},
),
),
},
ParameterWithDefault {
range: 83..87,
parameter: Parameter {
range: 83..84,
name: Identifier {
id: "c",
range: 83..84,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 85..87,
value: Int(
30,
),
},
),
),
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 89..90,
value: Int(
1,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 91..109,
value: Lambda(
ExprLambda {
range: 91..109,
parameters: Some(
Parameters {
range: 98..102,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 98..99,
parameter: Parameter {
range: 98..99,
name: Identifier {
id: "x",
range: 98..99,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 101..102,
parameter: Parameter {
range: 101..102,
name: Identifier {
id: "y",
range: 101..102,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: BinOp(
ExprBinOp {
range: 104..109,
left: Name(
ExprName {
range: 104..105,
id: "x",
ctx: Load,
},
),
op: Mult,
right: Name(
ExprName {
range: 108..109,
id: "y",
ctx: Load,
},
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 110..130,
value: Lambda(
ExprLambda {
range: 110..130,
parameters: Some(
Parameters {
range: 117..123,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 117..118,
parameter: Parameter {
range: 117..118,
name: Identifier {
id: "y",
range: 117..118,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 120..123,
parameter: Parameter {
range: 120..121,
name: Identifier {
id: "z",
range: 120..121,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 122..123,
value: Int(
1,
),
},
),
),
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: BinOp(
ExprBinOp {
range: 125..130,
left: Name(
ExprName {
range: 125..126,
id: "z",
ctx: Load,
},
),
op: Mult,
right: Name(
ExprName {
range: 129..130,
id: "y",
ctx: Load,
},
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 131..143,
value: Lambda(
ExprLambda {
range: 131..143,
parameters: Some(
Parameters {
range: 138..140,
posonlyargs: [],
args: [],
vararg: Some(
Parameter {
range: 138..140,
name: Identifier {
id: "a",
range: 139..140,
},
annotation: None,
},
),
kwonlyargs: [],
kwarg: None,
},
),
body: Name(
ExprName {
range: 142..143,
id: "a",
ctx: Load,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 144..166,
value: Lambda(
ExprLambda {
range: 144..166,
parameters: Some(
Parameters {
range: 151..161,
posonlyargs: [],
args: [],
vararg: Some(
Parameter {
range: 151..153,
name: Identifier {
id: "a",
range: 152..153,
},
annotation: None,
},
),
kwonlyargs: [
ParameterWithDefault {
range: 155..156,
parameter: Parameter {
range: 155..156,
name: Identifier {
id: "z",
range: 155..156,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 158..161,
parameter: Parameter {
range: 158..159,
name: Identifier {
id: "x",
range: 158..159,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 160..161,
value: Int(
0,
),
},
),
),
},
],
kwarg: None,
},
),
body: EllipsisLiteral(
ExprEllipsisLiteral {
range: 163..166,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 167..187,
value: Lambda(
ExprLambda {
range: 167..187,
parameters: Some(
Parameters {
range: 174..184,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 177..178,
parameter: Parameter {
range: 177..178,
name: Identifier {
id: "a",
range: 177..178,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 180..181,
parameter: Parameter {
range: 180..181,
name: Identifier {
id: "b",
range: 180..181,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 183..184,
parameter: Parameter {
range: 183..184,
name: Identifier {
id: "c",
range: 183..184,
},
annotation: None,
},
default: None,
},
],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 186..187,
value: Int(
1,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 188..214,
value: Lambda(
ExprLambda {
range: 188..214,
parameters: Some(
Parameters {
range: 195..211,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 198..199,
parameter: Parameter {
range: 198..199,
name: Identifier {
id: "a",
range: 198..199,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 201..205,
parameter: Parameter {
range: 201..202,
name: Identifier {
id: "b",
range: 201..202,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 203..205,
value: Int(
20,
),
},
),
),
},
ParameterWithDefault {
range: 207..211,
parameter: Parameter {
range: 207..208,
name: Identifier {
id: "c",
range: 207..208,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 209..211,
value: Int(
30,
),
},
),
),
},
],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 213..214,
value: Int(
1,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 215..241,
value: Lambda(
ExprLambda {
range: 215..241,
parameters: Some(
Parameters {
range: 222..238,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 222..223,
parameter: Parameter {
range: 222..223,
name: Identifier {
id: "a",
range: 222..223,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 225..226,
parameter: Parameter {
range: 225..226,
name: Identifier {
id: "b",
range: 225..226,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 228..229,
parameter: Parameter {
range: 228..229,
name: Identifier {
id: "c",
range: 228..229,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 234..235,
parameter: Parameter {
range: 234..235,
name: Identifier {
id: "d",
range: 234..235,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 237..238,
parameter: Parameter {
range: 237..238,
name: Identifier {
id: "e",
range: 237..238,
},
annotation: None,
},
default: None,
},
],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 240..241,
value: Int(
0,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 242..262,
value: Lambda(
ExprLambda {
range: 242..262,
parameters: Some(
Parameters {
range: 249..257,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [],
kwarg: Some(
Parameter {
range: 249..257,
name: Identifier {
id: "kwargs",
range: 251..257,
},
annotation: None,
},
),
},
),
body: Call(
ExprCall {
range: 259..262,
func: Name(
ExprName {
range: 259..260,
id: "f",
ctx: Load,
},
),
arguments: Arguments {
range: 260..262,
args: [],
keywords: [],
},
},
),
},
),
},
),
Expr(
StmtExpr {
range: 263..294,
value: Lambda(
ExprLambda {
range: 263..294,
parameters: Some(
Parameters {
range: 270..285,
posonlyargs: [],
args: [],
vararg: Some(
Parameter {
range: 270..275,
name: Identifier {
id: "args",
range: 271..275,
},
annotation: None,
},
),
kwonlyargs: [],
kwarg: Some(
Parameter {
range: 277..285,
name: Identifier {
id: "kwargs",
range: 279..285,
},
annotation: None,
},
),
},
),
body: BinOp(
ExprBinOp {
range: 287..294,
left: Call(
ExprCall {
range: 287..290,
func: Name(
ExprName {
range: 287..288,
id: "f",
ctx: Load,
},
),
arguments: Arguments {
range: 288..290,
args: [],
keywords: [],
},
},
),
op: Add,
right: NumberLiteral(
ExprNumberLiteral {
range: 293..294,
value: Int(
1,
),
},
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 295..334,
value: Lambda(
ExprLambda {
range: 295..334,
parameters: Some(
Parameters {
range: 302..325,
posonlyargs: [],
args: [],
vararg: Some(
Parameter {
range: 302..307,
name: Identifier {
id: "args",
range: 303..307,
},
annotation: None,
},
),
kwonlyargs: [
ParameterWithDefault {
range: 309..310,
parameter: Parameter {
range: 309..310,
name: Identifier {
id: "a",
range: 309..310,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 312..315,
parameter: Parameter {
range: 312..313,
name: Identifier {
id: "b",
range: 312..313,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 314..315,
value: Int(
1,
),
},
),
),
},
],
kwarg: Some(
Parameter {
range: 317..325,
name: Identifier {
id: "kwargs",
range: 319..325,
},
annotation: None,
},
),
},
),
body: BinOp(
ExprBinOp {
range: 327..334,
left: Call(
ExprCall {
range: 327..330,
func: Name(
ExprName {
range: 327..328,
id: "f",
ctx: Load,
},
),
arguments: Arguments {
range: 328..330,
args: [],
keywords: [],
},
},
),
op: Add,
right: NumberLiteral(
ExprNumberLiteral {
range: 333..334,
value: Int(
1,
),
},
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 335..351,
value: Lambda(
ExprLambda {
range: 335..351,
parameters: Some(
Parameters {
range: 342..346,
posonlyargs: [
ParameterWithDefault {
range: 342..343,
parameter: Parameter {
range: 342..343,
name: Identifier {
id: "a",
range: 342..343,
},
annotation: None,
},
default: None,
},
],
args: [],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: EllipsisLiteral(
ExprEllipsisLiteral {
range: 348..351,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 352..371,
value: Lambda(
ExprLambda {
range: 352..371,
parameters: Some(
Parameters {
range: 359..366,
posonlyargs: [
ParameterWithDefault {
range: 359..360,
parameter: Parameter {
range: 359..360,
name: Identifier {
id: "a",
range: 359..360,
},
annotation: None,
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 365..366,
parameter: Parameter {
range: 365..366,
name: Identifier {
id: "b",
range: 365..366,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: EllipsisLiteral(
ExprEllipsisLiteral {
range: 368..371,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 372..391,
value: Lambda(
ExprLambda {
range: 372..391,
parameters: Some(
Parameters {
range: 379..386,
posonlyargs: [
ParameterWithDefault {
range: 379..382,
parameter: Parameter {
range: 379..380,
name: Identifier {
id: "a",
range: 379..380,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 381..382,
value: Int(
1,
),
},
),
),
},
],
args: [],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: EllipsisLiteral(
ExprEllipsisLiteral {
range: 388..391,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 392..417,
value: Lambda(
ExprLambda {
range: 392..417,
parameters: Some(
Parameters {
range: 399..412,
posonlyargs: [
ParameterWithDefault {
range: 399..400,
parameter: Parameter {
range: 399..400,
name: Identifier {
id: "a",
range: 399..400,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 402..403,
parameter: Parameter {
range: 402..403,
name: Identifier {
id: "b",
range: 402..403,
},
annotation: None,
},
default: None,
},
],
args: [],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 411..412,
parameter: Parameter {
range: 411..412,
name: Identifier {
id: "c",
range: 411..412,
},
annotation: None,
},
default: None,
},
],
kwarg: None,
},
),
body: EllipsisLiteral(
ExprEllipsisLiteral {
range: 414..417,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 418..440,
value: Lambda(
ExprLambda {
range: 418..440,
parameters: Some(
Parameters {
range: 425..435,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 425..429,
parameter: Parameter {
range: 425..427,
name: Identifier {
id: "kw",
range: 425..427,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 428..429,
value: Int(
1,
),
},
),
),
},
],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 434..435,
parameter: Parameter {
range: 434..435,
name: Identifier {
id: "a",
range: 434..435,
},
annotation: None,
},
default: None,
},
],
kwarg: None,
},
),
body: EllipsisLiteral(
ExprEllipsisLiteral {
range: 437..440,
},
),
},
),
},
),
Expr(
StmtExpr {
range: 441..467,
value: Lambda(
ExprLambda {
range: 441..467,
parameters: Some(
Parameters {
range: 448..464,
posonlyargs: [
ParameterWithDefault {
range: 448..449,
parameter: Parameter {
range: 448..449,
name: Identifier {
id: "a",
range: 448..449,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 451..455,
parameter: Parameter {
range: 451..452,
name: Identifier {
id: "b",
range: 451..452,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 453..455,
value: Int(
20,
),
},
),
),
},
],
args: [
ParameterWithDefault {
range: 460..464,
parameter: Parameter {
range: 460..461,
name: Identifier {
id: "c",
range: 460..461,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 462..464,
value: Int(
30,
),
},
),
),
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 466..467,
value: Int(
1,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 468..497,
value: Lambda(
ExprLambda {
range: 468..497,
parameters: Some(
Parameters {
range: 475..494,
posonlyargs: [
ParameterWithDefault {
range: 475..476,
parameter: Parameter {
range: 475..476,
name: Identifier {
id: "a",
range: 475..476,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 478..479,
parameter: Parameter {
range: 478..479,
name: Identifier {
id: "b",
range: 478..479,
},
annotation: None,
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 484..485,
parameter: Parameter {
range: 484..485,
name: Identifier {
id: "c",
range: 484..485,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 490..491,
parameter: Parameter {
range: 490..491,
name: Identifier {
id: "d",
range: 490..491,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 493..494,
parameter: Parameter {
range: 493..494,
name: Identifier {
id: "e",
range: 493..494,
},
annotation: None,
},
default: None,
},
],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 496..497,
value: Int(
0,
),
},
),
},
),
},
),
Expr(
StmtExpr {
range: 498..530,
value: Lambda(
ExprLambda {
range: 498..530,
parameters: Some(
Parameters {
range: 505..527,
posonlyargs: [
ParameterWithDefault {
range: 505..506,
parameter: Parameter {
range: 505..506,
name: Identifier {
id: "a",
range: 505..506,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 508..509,
parameter: Parameter {
range: 508..509,
name: Identifier {
id: "b",
range: 508..509,
},
annotation: None,
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 514..515,
parameter: Parameter {
range: 514..515,
name: Identifier {
id: "c",
range: 514..515,
},
annotation: None,
},
default: None,
},
],
vararg: Some(
Parameter {
range: 517..519,
name: Identifier {
id: "d",
range: 518..519,
},
annotation: None,
},
),
kwonlyargs: [
ParameterWithDefault {
range: 521..522,
parameter: Parameter {
range: 521..522,
name: Identifier {
id: "e",
range: 521..522,
},
annotation: None,
},
default: None,
},
],
kwarg: Some(
Parameter {
range: 524..527,
name: Identifier {
id: "f",
range: 526..527,
},
annotation: None,
},
),
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 529..530,
value: Int(
0,
),
},
),
},
),
},
),
],
},
)
```