Make Parameters an optional field on ExprLambda (#6669)

## Summary

If a lambda doesn't contain any parameters, or any parameter _tokens_
(like `*`), we can use `None` for the parameters. This feels like a
better representation to me, since, e.g., what should the `TextRange` be
for a non-existent set of parameters? It also allows us to remove
several sites where we check if the `Parameters` is empty by seeing if
it contains any arguments, so semantically, we're already trying to
detect and model around this elsewhere.

Changing this also fixes a number of issues with dangling comments in
parameter-less lambdas, since those comments are now automatically
marked as dangling on the lambda. (As-is, we were also doing something
not-great whereby the lambda was responsible for formatting dangling
comments on the parameters, which has been removed.)

Closes https://github.com/astral-sh/ruff/issues/6646.

Closes https://github.com/astral-sh/ruff/issues/6647.

## Test Plan

`cargo test`
This commit is contained in:
Charlie Marsh 2023-08-18 11:34:54 -04:00 committed by GitHub
parent ea72d5feba
commit 6a5acde226
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 517 additions and 412 deletions

View file

@ -10,51 +10,53 @@ Ok(
value: Lambda(
ExprLambda {
range: 0..20,
parameters: Parameters {
range: 7..17,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 10..11,
parameter: Parameter {
parameters: Some(
Parameters {
range: 7..17,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 10..11,
name: Identifier {
id: "a",
parameter: Parameter {
range: 10..11,
name: Identifier {
id: "a",
range: 10..11,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 13..14,
parameter: Parameter {
ParameterWithDefault {
range: 13..14,
name: Identifier {
id: "b",
parameter: Parameter {
range: 13..14,
name: Identifier {
id: "b",
range: 13..14,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 16..17,
parameter: Parameter {
ParameterWithDefault {
range: 16..17,
name: Identifier {
id: "c",
parameter: Parameter {
range: 16..17,
name: Identifier {
id: "c",
range: 16..17,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
],
kwarg: None,
},
],
kwarg: None,
},
),
body: Constant(
ExprConstant {
range: 19..20,

View file

@ -10,71 +10,73 @@ Ok(
value: Lambda(
ExprLambda {
range: 0..26,
parameters: Parameters {
range: 7..23,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 10..11,
parameter: Parameter {
parameters: Some(
Parameters {
range: 7..23,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 10..11,
name: Identifier {
id: "a",
parameter: Parameter {
range: 10..11,
name: Identifier {
id: "a",
range: 10..11,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 13..17,
parameter: Parameter {
range: 13..14,
name: Identifier {
id: "b",
ParameterWithDefault {
range: 13..17,
parameter: Parameter {
range: 13..14,
},
annotation: None,
},
default: Some(
Constant(
ExprConstant {
range: 15..17,
value: Int(
20,
),
kind: None,
name: Identifier {
id: "b",
range: 13..14,
},
annotation: None,
},
default: Some(
Constant(
ExprConstant {
range: 15..17,
value: Int(
20,
),
kind: None,
},
),
),
),
},
ParameterWithDefault {
range: 19..23,
parameter: Parameter {
range: 19..20,
name: Identifier {
id: "c",
},
ParameterWithDefault {
range: 19..23,
parameter: Parameter {
range: 19..20,
},
annotation: None,
},
default: Some(
Constant(
ExprConstant {
range: 21..23,
value: Int(
30,
),
kind: None,
name: Identifier {
id: "c",
range: 19..20,
},
annotation: None,
},
default: Some(
Constant(
ExprConstant {
range: 21..23,
value: Int(
30,
),
kind: None,
},
),
),
),
},
],
kwarg: None,
},
},
],
kwarg: None,
},
),
body: Constant(
ExprConstant {
range: 25..26,

View file

@ -10,14 +10,7 @@ Ok(
value: Lambda(
ExprLambda {
range: 0..9,
parameters: Parameters {
range: 6..6,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
parameters: None,
body: Constant(
ExprConstant {
range: 8..9,

View file

@ -10,76 +10,78 @@ Ok(
value: Lambda(
ExprLambda {
range: 0..26,
parameters: Parameters {
range: 7..23,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 7..8,
parameter: Parameter {
parameters: Some(
Parameters {
range: 7..23,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 7..8,
name: Identifier {
id: "a",
parameter: Parameter {
range: 7..8,
name: Identifier {
id: "a",
range: 7..8,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 10..11,
parameter: Parameter {
ParameterWithDefault {
range: 10..11,
name: Identifier {
id: "b",
parameter: Parameter {
range: 10..11,
name: Identifier {
id: "b",
range: 10..11,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 13..14,
parameter: Parameter {
ParameterWithDefault {
range: 13..14,
name: Identifier {
id: "c",
parameter: Parameter {
range: 13..14,
name: Identifier {
id: "c",
range: 13..14,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 19..20,
parameter: Parameter {
],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 19..20,
name: Identifier {
id: "d",
parameter: Parameter {
range: 19..20,
name: Identifier {
id: "d",
range: 19..20,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 22..23,
parameter: Parameter {
ParameterWithDefault {
range: 22..23,
name: Identifier {
id: "e",
parameter: Parameter {
range: 22..23,
name: Identifier {
id: "e",
range: 22..23,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
],
kwarg: None,
},
],
kwarg: None,
},
),
body: Constant(
ExprConstant {
range: 25..26,

View file

@ -10,51 +10,53 @@ Ok(
value: Lambda(
ExprLambda {
range: 0..17,
parameters: Parameters {
range: 7..14,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 7..8,
parameter: Parameter {
parameters: Some(
Parameters {
range: 7..14,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 7..8,
name: Identifier {
id: "a",
parameter: Parameter {
range: 7..8,
name: Identifier {
id: "a",
range: 7..8,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 10..11,
parameter: Parameter {
ParameterWithDefault {
range: 10..11,
name: Identifier {
id: "b",
parameter: Parameter {
range: 10..11,
name: Identifier {
id: "b",
range: 10..11,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 13..14,
parameter: Parameter {
ParameterWithDefault {
range: 13..14,
name: Identifier {
id: "c",
parameter: Parameter {
range: 13..14,
name: Identifier {
id: "c",
range: 13..14,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: Constant(
ExprConstant {
range: 16..17,

View file

@ -10,71 +10,73 @@ Ok(
value: Lambda(
ExprLambda {
range: 0..23,
parameters: Parameters {
range: 7..20,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 7..8,
parameter: Parameter {
parameters: Some(
Parameters {
range: 7..20,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 7..8,
name: Identifier {
id: "a",
parameter: Parameter {
range: 7..8,
name: Identifier {
id: "a",
range: 7..8,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 10..14,
parameter: Parameter {
range: 10..11,
name: Identifier {
id: "b",
ParameterWithDefault {
range: 10..14,
parameter: Parameter {
range: 10..11,
},
annotation: None,
},
default: Some(
Constant(
ExprConstant {
range: 12..14,
value: Int(
20,
),
kind: None,
name: Identifier {
id: "b",
range: 10..11,
},
annotation: None,
},
default: Some(
Constant(
ExprConstant {
range: 12..14,
value: Int(
20,
),
kind: None,
},
),
),
),
},
ParameterWithDefault {
range: 16..20,
parameter: Parameter {
range: 16..17,
name: Identifier {
id: "c",
},
ParameterWithDefault {
range: 16..20,
parameter: Parameter {
range: 16..17,
},
annotation: None,
},
default: Some(
Constant(
ExprConstant {
range: 18..20,
value: Int(
30,
),
kind: None,
name: Identifier {
id: "c",
range: 16..17,
},
annotation: None,
},
default: Some(
Constant(
ExprConstant {
range: 18..20,
value: Int(
30,
),
kind: None,
},
),
),
),
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: Constant(
ExprConstant {
range: 22..23,

View file

@ -727,27 +727,29 @@ expression: "parse_suite(source, \"<test>\").unwrap()"
value: Lambda(
ExprLambda {
range: 591..619,
parameters: Parameters {
range: 598..603,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 598..603,
parameter: Parameter {
parameters: Some(
Parameters {
range: 598..603,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 598..603,
name: Identifier {
id: "query",
parameter: Parameter {
range: 598..603,
name: Identifier {
id: "query",
range: 598..603,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: Compare(
ExprCompare {
range: 605..619,

View file

@ -9,39 +9,41 @@ expression: parse_ast
value: Lambda(
ExprLambda {
range: 0..18,
parameters: Parameters {
range: 7..11,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 7..8,
parameter: Parameter {
parameters: Some(
Parameters {
range: 7..11,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 7..8,
name: Identifier {
id: "x",
parameter: Parameter {
range: 7..8,
name: Identifier {
id: "x",
range: 7..8,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
ParameterWithDefault {
range: 10..11,
parameter: Parameter {
ParameterWithDefault {
range: 10..11,
name: Identifier {
id: "y",
parameter: Parameter {
range: 10..11,
name: Identifier {
id: "y",
range: 10..11,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: BinOp(
ExprBinOp {
range: 13..18,

View file

@ -9,14 +9,7 @@ expression: parse_ast
value: Lambda(
ExprLambda {
range: 0..9,
parameters: Parameters {
range: 6..6,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
parameters: None,
body: Constant(
ExprConstant {
range: 8..9,

View file

@ -663,27 +663,29 @@ expression: "parse_suite(source, \"<test>\").unwrap()"
value: Lambda(
ExprLambda {
range: 507..535,
parameters: Parameters {
range: 514..519,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 514..519,
parameter: Parameter {
parameters: Some(
Parameters {
range: 514..519,
posonlyargs: [],
args: [
ParameterWithDefault {
range: 514..519,
name: Identifier {
id: "query",
parameter: Parameter {
range: 514..519,
name: Identifier {
id: "query",
range: 514..519,
},
annotation: None,
},
annotation: None,
default: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: Compare(
ExprCompare {
range: 521..535,