MCPcopy Create free account
hub / github.com/astral-sh/ruff / parse_parameters

Method parse_parameters

crates/ruff_python_parser/src/parser/statement.rs:3316–3609  ·  view source on GitHub ↗

Parses a parameter list for the given function kind. See:

(&mut self, function_kind: FunctionKind)

Source from the content-addressed store, hash-verified

3314 ///
3315 /// See: <https://docs.python.org/3/reference/compound_stmts.html#grammar-token-python-grammar-parameter_list>
3316 pub(super) fn parse_parameters(&mut self, function_kind: FunctionKind) -> ast::Parameters {
3317 let start = self.node_start();
3318
3319 if matches!(function_kind, FunctionKind::FunctionDef) {
3320 self.expect(TokenKind::Lpar);
3321 }
3322
3323 // TODO(dhruvmanila): This has the same problem as `parse_match_pattern_mapping`
3324 // has where if there are multiple kwarg or vararg, the last one will win and
3325 // the parser will drop the previous ones. Another thing is the vararg and kwarg
3326 // uses `Parameter` (not `ParameterWithDefault`) which means that the parser cannot
3327 // recover well from `*args=(1, 2)`.
3328 let mut parameters = ast::Parameters::default();
3329 let parameters_snapshot = self.parameter_scratch.snapshot();
3330 let mut args_snapshot = None;
3331 let mut kwonlyargs_snapshot = None;
3332
3333 let mut seen_default_param = false; // `a=10`
3334 let mut seen_positional_only_separator = false; // `/`
3335 let mut seen_keyword_only_separator = false; // `*`
3336 let mut seen_keyword_only_param_after_separator = false;
3337
3338 // Range of the keyword only separator if it's the last parameter in the list.
3339 let mut last_keyword_only_separator_range = None;
3340
3341 self.parse_comma_separated_list(RecoveryContextKind::Parameters(function_kind), |parser| {
3342 let param_start = parser.node_start();
3343
3344 if parameters.kwarg.is_some() {
3345 // test_err params_follows_var_keyword_param
3346 // def foo(**kwargs, a, /, b=10, *, *args): ...
3347 parser.add_error(
3348 ParseErrorType::ParamAfterVarKeywordParam,
3349 parser.current_token_range(),
3350 );
3351 }
3352
3353 match parser.current_token_kind() {
3354 TokenKind::Star => {
3355 let star_range = parser.current_token_range();
3356 parser.bump(TokenKind::Star);
3357
3358 kwonlyargs_snapshot.get_or_insert_with(|| parser.parameter_scratch.snapshot());
3359
3360 if parser.at_name_or_soft_keyword() {
3361 let param = parser.parse_parameter(
3362 param_start,
3363 function_kind,
3364 AllowStarAnnotation::Yes,
3365 );
3366 let param_star_range = parser.node_range(star_range.start());
3367
3368 if parser.at(TokenKind::Equal) {
3369 // test_err params_var_positional_with_default
3370 // def foo(a, *args=(1, 2)): ...
3371 parser.add_error(
3372 ParseErrorType::VarParameterWithDefault,
3373 parser.current_token_range(),

Callers 2

parse_lambda_exprMethod · 0.80

Calls 15

node_startMethod · 0.80
expectMethod · 0.80
current_token_rangeMethod · 0.80
current_token_kindMethod · 0.80
parse_parameterMethod · 0.80
node_rangeMethod · 0.80
take_thin_vecMethod · 0.80
defaultFunction · 0.50

Tested by

no test coverage detected