Fix incorrect Parameter range for *args and **kwargs (#10283)

## Summary

Fix #10282 

This PR updates the Python grammar to include the `*` character in
`*args` `**kwargs` in the range of the `Parameter`
```
def f(*args, **kwargs): pass
#      ~~~~    ~~~~~~    <-- range before the PR
#     ^^^^^  ^^^^^^^^    <-- range after
```

The invalid syntax `def f(*, **kwargs): ...` is also now correctly
reported.

## Test Plan

Test cases were added to `function.rs`.
This commit is contained in:
Gautier Moin 2024-03-09 00:57:49 +01:00 committed by GitHub
parent b64f2ea401
commit a067d87ccc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 28521 additions and 28529 deletions

View file

@ -176,19 +176,27 @@ mod tests {
function_and_lambda! {
test_function_no_args: "def f(): pass",
test_function_pos_args: "def f(a, b, c): pass",
test_function_pos_args_with_defaults: "def f(a, b=20, c=30): pass",
test_function_posonly_and_pos_args: "def f(a, /, b, c): pass",
test_function_pos_args_with_defaults: "def f(a, b=20, /, c=30): pass",
test_function_pos_args_with_defaults_and_varargs_and_kwargs: "def f(a, b=20, /, c=30, *args, **kwargs): pass",
test_function_kw_only_args: "def f(*, a, b, c): pass",
test_function_kw_only_args_with_defaults: "def f(*, a, b=20, c=30): pass",
test_function_pos_and_kw_only_args: "def f(a, b, c, *, d, e, f): pass",
test_function_pos_and_kw_only_args_with_defaults: "def f(a, b, c, *, d, e=20, f=30): pass",
test_function_pos_and_kw_only_args_with_defaults_and_varargs: "def f(a, b, c, *args, d, e=20, f=30): pass",
test_function_pos_and_kw_only_args_with_defaults_and_varargs_and_kwargs: "def f(a, b, c, *args, d, e=20, f=30, **kwargs): pass",
test_function_kw_only_args_with_defaults_and_varargs: "def f(*args, a, b=20, c=30): pass",
test_function_kw_only_args_with_defaults_and_kwargs: "def f(*, a, b=20, c=30, **kwargs): pass",
test_function_kw_only_args_with_defaults_and_varargs_and_kwargs: "def f(*args, a, b=20, c=30, **kwargs): pass",
test_function_pos_and_kw_only_args: "def f(a, b, /, c, *, d, e, f): pass",
test_function_pos_and_kw_only_args_with_defaults: "def f(a, b, /, c, *, d, e=20, f=30): pass",
test_function_pos_and_kw_only_args_with_defaults_and_varargs: "def f(a, b, /, c, *args, d, e=20, f=30): pass",
test_function_pos_and_kw_only_args_with_defaults_and_kwargs: "def f(a, b, /, c, *, d, e=20, f=30, **kwargs): pass",
test_function_pos_and_kw_only_args_with_defaults_and_varargs_and_kwargs: "def f(a, b, /, c, *args, d, e=20, f=30, **kwargs): pass",
test_lambda_no_args: "lambda: 1",
test_lambda_pos_args: "lambda a, b, c: 1",
test_lambda_pos_args_with_defaults: "lambda a, b=20, c=30: 1",
test_lambda_posonly_args: "lambda a, b, /, c: 1",
test_lambda_pos_args_with_defaults: "lambda a, b=20, /, c=30: 1",
test_lambda_kw_only_args: "lambda *, a, b, c: 1",
test_lambda_kw_only_args_with_defaults: "lambda *, a, b=20, c=30: 1",
test_lambda_pos_and_kw_only_args: "lambda a, b, c, *, d, e: 0",
test_lambda_pos_and_kw_only_args: "lambda a, b, /, c, *, d, e: 0",
test_lambda_pos_and_kw_only_args_and_vararg_and_kwarg: "lambda a, b, /, c, *d, e, **f: 0",
}
fn function_parse_error(src: &str) -> LexicalErrorType {
@ -219,14 +227,16 @@ mod tests {
test_duplicates_f2: "def f(a, *, a): pass", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_f3: "def f(a, a=20): pass", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_f4: "def f(a, *a): pass", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_f5: "def f(a, *, **a): pass", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_f5: "def f(a, *, b, **a): pass", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_l1: "lambda a, a: 1", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_l2: "lambda a, *, a: 1", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_l3: "lambda a, a=20: 1", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_l4: "lambda a, *a: 1", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_l5: "lambda a, *, **a: 1", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_duplicates_l5: "lambda a, *, b, **a: 1", LexicalErrorType::DuplicateArgumentError("a".to_string().into_boxed_str()),
test_default_arg_error_f: "def f(a, b=20, c): pass", LexicalErrorType::DefaultArgumentError,
test_default_arg_error_l: "lambda a, b=20, c: 1", LexicalErrorType::DefaultArgumentError,
test_named_arguments_follow_bare_star_1: "def f(*): pass", LexicalErrorType::OtherError("named arguments must follow bare *".to_string().into_boxed_str()),
test_named_arguments_follow_bare_star_2: "def f(*, **kwargs): pass", LexicalErrorType::OtherError("named arguments must follow bare *".to_string().into_boxed_str()),
// Check some calls.
test_positional_arg_error_f: "f(b=20, c)", LexicalErrorType::PositionalArgumentError,

View file

@ -1151,24 +1151,6 @@ ParameterList<ParameterType, StarParameterType, DoubleStarParameterType>: ast::P
range: (location..end_location).into()
})
},
<location:@L> <param1:ParameterDefs<ParameterType>> <kw:("," <KwargParameter<DoubleStarParameterType>>)> ","? <end_location:@R> =>? {
validate_pos_params(&param1)?;
let (posonlyargs, args) = param1;
// Now gather rest of parameters:
let vararg = None;
let kwonlyargs = vec![];
let kwarg = kw;
Ok(ast::Parameters {
posonlyargs,
args,
kwonlyargs,
vararg,
kwarg,
range: (location..end_location).into()
})
},
<location:@L> <params:ParameterListStarArgs<ParameterType, StarParameterType, DoubleStarParameterType>> ","? <end_location:@R> => {
let (vararg, kwonlyargs, kwarg) = params;
ast::Parameters {
@ -1180,16 +1162,6 @@ ParameterList<ParameterType, StarParameterType, DoubleStarParameterType>: ast::P
range: (location..end_location).into()
}
},
<location:@L> <kwarg:KwargParameter<DoubleStarParameterType>> ","? <end_location:@R> => {
ast::Parameters {
posonlyargs: vec![],
args: vec![],
kwonlyargs: vec![],
vararg: None,
kwarg,
range: (location..end_location).into()
}
},
};
// Use inline here to make sure the "," is not creating an ambiguity.
@ -1219,7 +1191,11 @@ UntypedParameter: ast::ParameterWithDefault = {
},
};
StarUntypedParameter: ast::Parameter = {
<location:@L> <arg:Identifier> <end_location:@R> => ast::Parameter { name:arg, annotation: None, range: (location..end_location).into() },
<location:@L> "*" <arg:Identifier> <end_location:@R> => ast::Parameter { name:arg, annotation: None, range: (location..end_location).into() },
};
DoubleStarUntypedParameter: ast::Parameter = {
<location:@L> "**" <arg:Identifier> <end_location:@R> => ast::Parameter { name:arg, annotation: None, range: (location..end_location).into() },
};
TypedParameter: ast::ParameterWithDefault = {
@ -1231,14 +1207,14 @@ TypedParameter: ast::ParameterWithDefault = {
};
StarTypedParameter: ast::Parameter = {
<location:@L> <name:Identifier> <annotation:(":" <TestOrStarExpr>)?> <end_location:@R> => {
<location:@L> "*" <name:Identifier> <annotation:(":" <TestOrStarExpr>)?> <end_location:@R> => {
let annotation = annotation.map(ast::Expr::from).map(Box::new);
ast::Parameter { name, annotation, range: (location..end_location).into() }
},
};
DoubleStarTypedParameter: ast::Parameter = {
<location:@L> <name:Identifier> <annotation:(":" <Test<"all">>)?> <end_location:@R> => {
<location:@L> "**" <name:Identifier> <annotation:(":" <Test<"all">>)?> <end_location:@R> => {
let annotation = annotation.map(ast::Expr::from).map(Box::new);
ast::Parameter { name, annotation, range: (location..end_location).into() }
},
@ -1248,25 +1224,29 @@ DoubleStarTypedParameter: ast::Parameter = {
// TODO: figure out another grammar that makes this inline no longer required.
#[inline]
ParameterListStarArgs<ParameterType, StarParameterType, DoubleStarParameterType>: (Option<Box<ast::Parameter>>, Vec<ast::ParameterWithDefault>, Option<Box<ast::Parameter>>) = {
<location:@L> "*" <va:StarParameterType?> <kwonlyargs:("," <ParameterDef<ParameterType>>)*> <kwarg:("," <KwargParameter<DoubleStarParameterType>>)?> =>? {
if va.is_none() && kwonlyargs.is_empty() && kwarg.is_none() {
<location:@L> <va:StarParameterType> <kwonlyargs:("," <ParameterDef<ParameterType>>)*> <kwarg:("," <DoubleStarParameterType>)?> =>? {
let kwarg = kwarg.map(Box::new);
let va = Some(Box::new(va));
Ok((va, kwonlyargs, kwarg))
},
<location:@L> "*" <kwonlyargs:("," <ParameterDef<ParameterType>>)*> <kwarg:("," <DoubleStarParameterType>)?> =>? {
if kwonlyargs.is_empty() {
return Err(LexicalError::new(
LexicalErrorType::OtherError("named arguments must follow bare *".to_string().into_boxed_str()),
location,
))?;
}
let kwarg = kwarg.flatten();
let va = va.map(Box::new);
let kwarg = kwarg.map(Box::new);
Ok((va, kwonlyargs, kwarg))
}
};
Ok((None, kwonlyargs, kwarg))
},
<location:@L> <kwarg:(<DoubleStarParameterType>)> =>? {
let kwarg = Some(Box::new(kwarg));
KwargParameter<ParameterType>: Option<Box<ast::Parameter>> = {
"**" <kwarg:ParameterType?> => {
kwarg.map(Box::new)
}
Ok((None, vec![], kwarg))
},
};
ClassDef: ast::Stmt = {
@ -1365,7 +1345,7 @@ NamedExpression: crate::parser::ParenthesizedExpr = {
};
LambdaDef: crate::parser::ParenthesizedExpr = {
<location:@L> "lambda" <location_args:@L> <parameters:ParameterList<UntypedParameter, StarUntypedParameter, StarUntypedParameter>?> <end_location_args:@R> ":" <fstring_middle:fstring_middle?> <body:Test<"all">> <end_location:@R> =>? {
<location:@L> "lambda" <location_args:@L> <parameters:ParameterList<UntypedParameter, StarUntypedParameter, DoubleStarUntypedParameter>?> <end_location_args:@R> ":" <fstring_middle:fstring_middle?> <body:Test<"all">> <end_location:@R> =>? {
if fstring_middle.is_some() {
return Err(LexicalError::new(
LexicalErrorType::FStringError(FStringErrorType::LambdaWithoutParentheses),

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,100 @@
---
source: crates/ruff_python_parser/src/function.rs
expression: parse_ast
---
Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..39,
is_async: false,
decorator_list: [],
name: Identifier {
id: "f",
range: 4..5,
},
type_params: None,
parameters: Parameters {
range: 5..33,
posonlyargs: [],
args: [],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 9..10,
parameter: Parameter {
range: 9..10,
name: Identifier {
id: "a",
range: 9..10,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 12..16,
parameter: Parameter {
range: 12..13,
name: Identifier {
id: "b",
range: 12..13,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 14..16,
value: Int(
20,
),
},
),
),
},
ParameterWithDefault {
range: 18..22,
parameter: Parameter {
range: 18..19,
name: Identifier {
id: "c",
range: 18..19,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 20..22,
value: Int(
30,
),
},
),
),
},
],
kwarg: Some(
Parameter {
range: 24..32,
name: Identifier {
id: "kwargs",
range: 26..32,
},
annotation: None,
},
),
},
returns: None,
body: [
Pass(
StmtPass {
range: 35..39,
},
),
],
},
),
],
)

View file

@ -0,0 +1,100 @@
---
source: crates/ruff_python_parser/src/function.rs
expression: parse_ast
---
Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..33,
is_async: false,
decorator_list: [],
name: Identifier {
id: "f",
range: 4..5,
},
type_params: None,
parameters: Parameters {
range: 5..27,
posonlyargs: [],
args: [],
vararg: Some(
Parameter {
range: 6..11,
name: Identifier {
id: "args",
range: 7..11,
},
annotation: None,
},
),
kwonlyargs: [
ParameterWithDefault {
range: 13..14,
parameter: Parameter {
range: 13..14,
name: Identifier {
id: "a",
range: 13..14,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 16..20,
parameter: Parameter {
range: 16..17,
name: Identifier {
id: "b",
range: 16..17,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 18..20,
value: Int(
20,
),
},
),
),
},
ParameterWithDefault {
range: 22..26,
parameter: Parameter {
range: 22..23,
name: Identifier {
id: "c",
range: 22..23,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 24..26,
value: Int(
30,
),
},
),
),
},
],
kwarg: None,
},
returns: None,
body: [
Pass(
StmtPass {
range: 29..33,
},
),
],
},
),
],
)

View file

@ -0,0 +1,109 @@
---
source: crates/ruff_python_parser/src/function.rs
expression: parse_ast
---
Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..43,
is_async: false,
decorator_list: [],
name: Identifier {
id: "f",
range: 4..5,
},
type_params: None,
parameters: Parameters {
range: 5..37,
posonlyargs: [],
args: [],
vararg: Some(
Parameter {
range: 6..11,
name: Identifier {
id: "args",
range: 7..11,
},
annotation: None,
},
),
kwonlyargs: [
ParameterWithDefault {
range: 13..14,
parameter: Parameter {
range: 13..14,
name: Identifier {
id: "a",
range: 13..14,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 16..20,
parameter: Parameter {
range: 16..17,
name: Identifier {
id: "b",
range: 16..17,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 18..20,
value: Int(
20,
),
},
),
),
},
ParameterWithDefault {
range: 22..26,
parameter: Parameter {
range: 22..23,
name: Identifier {
id: "c",
range: 22..23,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 24..26,
value: Int(
30,
),
},
),
),
},
],
kwarg: Some(
Parameter {
range: 28..36,
name: Identifier {
id: "kwargs",
range: 30..36,
},
annotation: None,
},
),
},
returns: None,
body: [
Pass(
StmtPass {
range: 39..43,
},
),
],
},
),
],
)

View file

@ -6,7 +6,7 @@ Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..32,
range: 0..35,
is_async: false,
decorator_list: [],
name: Identifier {
@ -15,9 +15,8 @@ Ok(
},
type_params: None,
parameters: Parameters {
range: 5..26,
posonlyargs: [],
args: [
range: 5..29,
posonlyargs: [
ParameterWithDefault {
range: 6..7,
parameter: Parameter {
@ -42,13 +41,15 @@ Ok(
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 12..13,
range: 15..16,
parameter: Parameter {
range: 12..13,
range: 15..16,
name: Identifier {
id: "c",
range: 12..13,
range: 15..16,
},
annotation: None,
},
@ -57,24 +58,12 @@ Ok(
],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 18..19,
parameter: Parameter {
range: 18..19,
name: Identifier {
id: "d",
range: 18..19,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 21..22,
parameter: Parameter {
range: 21..22,
name: Identifier {
id: "e",
id: "d",
range: 21..22,
},
annotation: None,
@ -86,13 +75,25 @@ Ok(
parameter: Parameter {
range: 24..25,
name: Identifier {
id: "f",
id: "e",
range: 24..25,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 27..28,
parameter: Parameter {
range: 27..28,
name: Identifier {
id: "f",
range: 27..28,
},
annotation: None,
},
default: None,
},
],
kwarg: None,
},
@ -100,7 +101,7 @@ Ok(
body: [
Pass(
StmtPass {
range: 28..32,
range: 31..35,
},
),
],

View file

@ -6,7 +6,7 @@ Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..38,
range: 0..41,
is_async: false,
decorator_list: [],
name: Identifier {
@ -15,9 +15,8 @@ Ok(
},
type_params: None,
parameters: Parameters {
range: 5..32,
posonlyargs: [],
args: [
range: 5..35,
posonlyargs: [
ParameterWithDefault {
range: 6..7,
parameter: Parameter {
@ -42,13 +41,15 @@ Ok(
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 12..13,
range: 15..16,
parameter: Parameter {
range: 12..13,
range: 15..16,
name: Identifier {
id: "c",
range: 12..13,
range: 15..16,
},
annotation: None,
},
@ -58,31 +59,31 @@ Ok(
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 18..19,
range: 21..22,
parameter: Parameter {
range: 18..19,
range: 21..22,
name: Identifier {
id: "d",
range: 18..19,
range: 21..22,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 21..25,
range: 24..28,
parameter: Parameter {
range: 21..22,
range: 24..25,
name: Identifier {
id: "e",
range: 21..22,
range: 24..25,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 23..25,
range: 26..28,
value: Int(
20,
),
@ -91,19 +92,19 @@ Ok(
),
},
ParameterWithDefault {
range: 27..31,
range: 30..34,
parameter: Parameter {
range: 27..28,
range: 30..31,
name: Identifier {
id: "f",
range: 27..28,
range: 30..31,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 29..31,
range: 32..34,
value: Int(
30,
),
@ -118,7 +119,7 @@ Ok(
body: [
Pass(
StmtPass {
range: 34..38,
range: 37..41,
},
),
],

View file

@ -0,0 +1,138 @@
---
source: crates/ruff_python_parser/src/function.rs
expression: parse_ast
---
Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..51,
is_async: false,
decorator_list: [],
name: Identifier {
id: "f",
range: 4..5,
},
type_params: None,
parameters: Parameters {
range: 5..45,
posonlyargs: [
ParameterWithDefault {
range: 6..7,
parameter: Parameter {
range: 6..7,
name: Identifier {
id: "a",
range: 6..7,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 9..10,
parameter: Parameter {
range: 9..10,
name: Identifier {
id: "b",
range: 9..10,
},
annotation: None,
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 15..16,
parameter: Parameter {
range: 15..16,
name: Identifier {
id: "c",
range: 15..16,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 21..22,
parameter: Parameter {
range: 21..22,
name: Identifier {
id: "d",
range: 21..22,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 24..28,
parameter: Parameter {
range: 24..25,
name: Identifier {
id: "e",
range: 24..25,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 26..28,
value: Int(
20,
),
},
),
),
},
ParameterWithDefault {
range: 30..34,
parameter: Parameter {
range: 30..31,
name: Identifier {
id: "f",
range: 30..31,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 32..34,
value: Int(
30,
),
},
),
),
},
],
kwarg: Some(
Parameter {
range: 36..44,
name: Identifier {
id: "kwargs",
range: 38..44,
},
annotation: None,
},
),
},
returns: None,
body: [
Pass(
StmtPass {
range: 47..51,
},
),
],
},
),
],
)

View file

@ -6,7 +6,7 @@ Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..42,
range: 0..45,
is_async: false,
decorator_list: [],
name: Identifier {
@ -15,9 +15,8 @@ Ok(
},
type_params: None,
parameters: Parameters {
range: 5..36,
posonlyargs: [],
args: [
range: 5..39,
posonlyargs: [
ParameterWithDefault {
range: 6..7,
parameter: Parameter {
@ -42,13 +41,15 @@ Ok(
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 12..13,
range: 15..16,
parameter: Parameter {
range: 12..13,
range: 15..16,
name: Identifier {
id: "c",
range: 12..13,
range: 15..16,
},
annotation: None,
},
@ -57,41 +58,41 @@ Ok(
],
vararg: Some(
Parameter {
range: 16..20,
range: 18..23,
name: Identifier {
id: "args",
range: 16..20,
range: 19..23,
},
annotation: None,
},
),
kwonlyargs: [
ParameterWithDefault {
range: 22..23,
range: 25..26,
parameter: Parameter {
range: 22..23,
range: 25..26,
name: Identifier {
id: "d",
range: 22..23,
range: 25..26,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 25..29,
range: 28..32,
parameter: Parameter {
range: 25..26,
range: 28..29,
name: Identifier {
id: "e",
range: 25..26,
range: 28..29,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 27..29,
range: 30..32,
value: Int(
20,
),
@ -100,19 +101,19 @@ Ok(
),
},
ParameterWithDefault {
range: 31..35,
range: 34..38,
parameter: Parameter {
range: 31..32,
range: 34..35,
name: Identifier {
id: "f",
range: 31..32,
range: 34..35,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 33..35,
range: 36..38,
value: Int(
30,
),
@ -127,7 +128,7 @@ Ok(
body: [
Pass(
StmtPass {
range: 38..42,
range: 41..45,
},
),
],

View file

@ -6,7 +6,7 @@ Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..52,
range: 0..55,
is_async: false,
decorator_list: [],
name: Identifier {
@ -15,9 +15,8 @@ Ok(
},
type_params: None,
parameters: Parameters {
range: 5..46,
posonlyargs: [],
args: [
range: 5..49,
posonlyargs: [
ParameterWithDefault {
range: 6..7,
parameter: Parameter {
@ -42,13 +41,15 @@ Ok(
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 12..13,
range: 15..16,
parameter: Parameter {
range: 12..13,
range: 15..16,
name: Identifier {
id: "c",
range: 12..13,
range: 15..16,
},
annotation: None,
},
@ -57,41 +58,41 @@ Ok(
],
vararg: Some(
Parameter {
range: 16..20,
range: 18..23,
name: Identifier {
id: "args",
range: 16..20,
range: 19..23,
},
annotation: None,
},
),
kwonlyargs: [
ParameterWithDefault {
range: 22..23,
range: 25..26,
parameter: Parameter {
range: 22..23,
range: 25..26,
name: Identifier {
id: "d",
range: 22..23,
range: 25..26,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 25..29,
range: 28..32,
parameter: Parameter {
range: 25..26,
range: 28..29,
name: Identifier {
id: "e",
range: 25..26,
range: 28..29,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 27..29,
range: 30..32,
value: Int(
20,
),
@ -100,19 +101,19 @@ Ok(
),
},
ParameterWithDefault {
range: 31..35,
range: 34..38,
parameter: Parameter {
range: 31..32,
range: 34..35,
name: Identifier {
id: "f",
range: 31..32,
range: 34..35,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 33..35,
range: 36..38,
value: Int(
30,
),
@ -123,10 +124,10 @@ Ok(
],
kwarg: Some(
Parameter {
range: 39..45,
range: 40..48,
name: Identifier {
id: "kwargs",
range: 39..45,
range: 42..48,
},
annotation: None,
},
@ -136,7 +137,7 @@ Ok(
body: [
Pass(
StmtPass {
range: 48..52,
range: 51..55,
},
),
],

View file

@ -6,7 +6,7 @@ Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..26,
range: 0..29,
is_async: false,
decorator_list: [],
name: Identifier {
@ -15,9 +15,8 @@ Ok(
},
type_params: None,
parameters: Parameters {
range: 5..20,
posonlyargs: [],
args: [
range: 5..23,
posonlyargs: [
ParameterWithDefault {
range: 6..7,
parameter: Parameter {
@ -51,20 +50,22 @@ Ok(
),
),
},
],
args: [
ParameterWithDefault {
range: 15..19,
range: 18..22,
parameter: Parameter {
range: 15..16,
range: 18..19,
name: Identifier {
id: "c",
range: 15..16,
range: 18..19,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 17..19,
range: 20..22,
value: Int(
30,
),
@ -81,7 +82,7 @@ Ok(
body: [
Pass(
StmtPass {
range: 22..26,
range: 25..29,
},
),
],

View file

@ -0,0 +1,110 @@
---
source: crates/ruff_python_parser/src/function.rs
expression: parse_ast
---
Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..46,
is_async: false,
decorator_list: [],
name: Identifier {
id: "f",
range: 4..5,
},
type_params: None,
parameters: Parameters {
range: 5..40,
posonlyargs: [
ParameterWithDefault {
range: 6..7,
parameter: Parameter {
range: 6..7,
name: Identifier {
id: "a",
range: 6..7,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 9..13,
parameter: Parameter {
range: 9..10,
name: Identifier {
id: "b",
range: 9..10,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 11..13,
value: Int(
20,
),
},
),
),
},
],
args: [
ParameterWithDefault {
range: 18..22,
parameter: Parameter {
range: 18..19,
name: Identifier {
id: "c",
range: 18..19,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 20..22,
value: Int(
30,
),
},
),
),
},
],
vararg: Some(
Parameter {
range: 24..29,
name: Identifier {
id: "args",
range: 25..29,
},
annotation: None,
},
),
kwonlyargs: [],
kwarg: Some(
Parameter {
range: 31..39,
name: Identifier {
id: "kwargs",
range: 33..39,
},
annotation: None,
},
),
},
returns: None,
body: [
Pass(
StmtPass {
range: 42..46,
},
),
],
},
),
],
)

View file

@ -0,0 +1,74 @@
---
source: crates/ruff_python_parser/src/function.rs
expression: parse_ast
---
Ok(
[
FunctionDef(
StmtFunctionDef {
range: 0..23,
is_async: false,
decorator_list: [],
name: Identifier {
id: "f",
range: 4..5,
},
type_params: None,
parameters: Parameters {
range: 5..17,
posonlyargs: [
ParameterWithDefault {
range: 6..7,
parameter: Parameter {
range: 6..7,
name: Identifier {
id: "a",
range: 6..7,
},
annotation: None,
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 12..13,
parameter: Parameter {
range: 12..13,
name: Identifier {
id: "b",
range: 12..13,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 15..16,
parameter: Parameter {
range: 15..16,
name: Identifier {
id: "c",
range: 15..16,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
returns: None,
body: [
Pass(
StmtPass {
range: 19..23,
},
),
],
},
),
],
)

View file

@ -6,15 +6,14 @@ Ok(
[
Expr(
StmtExpr {
range: 0..26,
range: 0..29,
value: Lambda(
ExprLambda {
range: 0..26,
range: 0..29,
parameters: Some(
Parameters {
range: 7..23,
posonlyargs: [],
args: [
range: 7..26,
posonlyargs: [
ParameterWithDefault {
range: 7..8,
parameter: Parameter {
@ -39,13 +38,15 @@ Ok(
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 13..14,
range: 16..17,
parameter: Parameter {
range: 13..14,
range: 16..17,
name: Identifier {
id: "c",
range: 13..14,
range: 16..17,
},
annotation: None,
},
@ -55,24 +56,24 @@ Ok(
vararg: None,
kwonlyargs: [
ParameterWithDefault {
range: 19..20,
range: 22..23,
parameter: Parameter {
range: 19..20,
range: 22..23,
name: Identifier {
id: "d",
range: 19..20,
range: 22..23,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 22..23,
range: 25..26,
parameter: Parameter {
range: 22..23,
range: 25..26,
name: Identifier {
id: "e",
range: 22..23,
range: 25..26,
},
annotation: None,
},
@ -84,7 +85,7 @@ Ok(
),
body: NumberLiteral(
ExprNumberLiteral {
range: 25..26,
range: 28..29,
value: Int(
0,
),

View file

@ -0,0 +1,105 @@
---
source: crates/ruff_python_parser/src/function.rs
expression: parse_ast
---
Ok(
[
Expr(
StmtExpr {
range: 0..32,
value: Lambda(
ExprLambda {
range: 0..32,
parameters: Some(
Parameters {
range: 7..29,
posonlyargs: [
ParameterWithDefault {
range: 7..8,
parameter: Parameter {
range: 7..8,
name: Identifier {
id: "a",
range: 7..8,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 10..11,
parameter: Parameter {
range: 10..11,
name: Identifier {
id: "b",
range: 10..11,
},
annotation: None,
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 16..17,
parameter: Parameter {
range: 16..17,
name: Identifier {
id: "c",
range: 16..17,
},
annotation: None,
},
default: None,
},
],
vararg: Some(
Parameter {
range: 19..21,
name: Identifier {
id: "d",
range: 20..21,
},
annotation: None,
},
),
kwonlyargs: [
ParameterWithDefault {
range: 23..24,
parameter: Parameter {
range: 23..24,
name: Identifier {
id: "e",
range: 23..24,
},
annotation: None,
},
default: None,
},
],
kwarg: Some(
Parameter {
range: 26..29,
name: Identifier {
id: "f",
range: 28..29,
},
annotation: None,
},
),
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 31..32,
value: Int(
0,
),
},
),
},
),
},
),
],
)

View file

@ -6,15 +6,14 @@ Ok(
[
Expr(
StmtExpr {
range: 0..23,
range: 0..26,
value: Lambda(
ExprLambda {
range: 0..23,
range: 0..26,
parameters: Some(
Parameters {
range: 7..20,
posonlyargs: [],
args: [
range: 7..23,
posonlyargs: [
ParameterWithDefault {
range: 7..8,
parameter: Parameter {
@ -48,20 +47,22 @@ Ok(
),
),
},
],
args: [
ParameterWithDefault {
range: 16..20,
range: 19..23,
parameter: Parameter {
range: 16..17,
range: 19..20,
name: Identifier {
id: "c",
range: 16..17,
range: 19..20,
},
annotation: None,
},
default: Some(
NumberLiteral(
ExprNumberLiteral {
range: 18..20,
range: 21..23,
value: Int(
30,
),
@ -77,7 +78,7 @@ Ok(
),
body: NumberLiteral(
ExprNumberLiteral {
range: 22..23,
range: 25..26,
value: Int(
1,
),

View file

@ -0,0 +1,74 @@
---
source: crates/ruff_python_parser/src/function.rs
expression: parse_ast
---
Ok(
[
Expr(
StmtExpr {
range: 0..20,
value: Lambda(
ExprLambda {
range: 0..20,
parameters: Some(
Parameters {
range: 7..17,
posonlyargs: [
ParameterWithDefault {
range: 7..8,
parameter: Parameter {
range: 7..8,
name: Identifier {
id: "a",
range: 7..8,
},
annotation: None,
},
default: None,
},
ParameterWithDefault {
range: 10..11,
parameter: Parameter {
range: 10..11,
name: Identifier {
id: "b",
range: 10..11,
},
annotation: None,
},
default: None,
},
],
args: [
ParameterWithDefault {
range: 16..17,
parameter: Parameter {
range: 16..17,
name: Identifier {
id: "c",
range: 16..17,
},
annotation: None,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: NumberLiteral(
ExprNumberLiteral {
range: 19..20,
value: Int(
1,
),
},
),
},
),
},
),
],
)

View file

@ -346,7 +346,7 @@ expression: parse_suite(source).unwrap()
args: [],
vararg: Some(
Parameter {
range: 155..161,
range: 154..161,
name: Identifier {
id: "a",
range: 155..156,
@ -417,7 +417,7 @@ expression: parse_suite(source).unwrap()
args: [],
vararg: Some(
Parameter {
range: 188..200,
range: 187..200,
name: Identifier {
id: "args",
range: 188..192,
@ -446,7 +446,7 @@ expression: parse_suite(source).unwrap()
kwonlyargs: [],
kwarg: Some(
Parameter {
range: 204..220,
range: 202..220,
name: Identifier {
id: "kwargs",
range: 204..210,

View file

@ -19,7 +19,7 @@ expression: parse_ast
args: [],
vararg: Some(
Parameter {
range: 20..29,
range: 19..29,
name: Identifier {
id: "args",
range: 20..24,