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

Method parse_arguments

crates/ruff_python_parser/src/parser/expression.rs:729–881  ·  view source on GitHub ↗

Parses an argument list. # Panics If the parser isn't positioned at a `(` token. See:

(&mut self, context: ArgumentsContext)

Source from the content-addressed store, hash-verified

727 ///
728 /// See: <https://docs.python.org/3/reference/expressions.html#grammar-token-python-grammar-argument_list>
729 pub(super) fn parse_arguments(&mut self, context: ArgumentsContext) -> ast::Arguments {
730 let start = self.node_start();
731 self.bump(TokenKind::Lpar);
732
733 if self.eat(TokenKind::Rpar) {
734 return ast::Arguments {
735 range: self.node_range(start),
736 node_index: AtomicNodeIndex::NONE,
737 args: Box::default(),
738 keywords: ThinVec::default(),
739 };
740 }
741
742 let args_snapshot = self.expr_scratch.snapshot();
743 let keywords_snapshot = self.keyword_scratch.snapshot();
744 let mut seen_keyword_argument = false; // foo = 1
745 let mut seen_keyword_unpacking = false; // **foo
746
747 let has_trailing_comma =
748 self.parse_comma_separated_list(RecoveryContextKind::Arguments, |parser| {
749 let argument_start = parser.node_start();
750 if parser.eat(TokenKind::DoubleStar) {
751 let value = parser.parse_conditional_expression_or_higher();
752
753 parser.keyword_scratch.push(ast::Keyword {
754 arg: None,
755 value: value.expr,
756 range: parser.node_range(argument_start),
757 node_index: AtomicNodeIndex::NONE,
758 });
759
760 seen_keyword_unpacking = true;
761 } else {
762 let start = parser.node_start();
763 let mut parsed_expr = parser
764 .parse_named_expression_or_higher(ExpressionContext::starred_conditional());
765
766 match parser.current_token_kind() {
767 TokenKind::Async | TokenKind::For => {
768 if parsed_expr.is_unparenthesized_starred_expr() {
769 parser.add_unsupported_syntax_error(
770 UnsupportedSyntaxErrorKind::UnpackingInComprehension(
771 ComprehensionUnpackingKind::IterableInGenerator,
772 ),
773 parsed_expr.range(),
774 );
775 }
776
777 parsed_expr = Expr::Generator(parser.parse_generator_expression(
778 parsed_expr.expr,
779 start,
780 Parenthesized::No,
781 ))
782 .into();
783 }
784 _ => {
785 if seen_keyword_unpacking
786 && parsed_expr.is_unparenthesized_starred_expr()

Callers 2

parse_call_expressionMethod · 0.80

Calls 15

node_startMethod · 0.80
node_rangeMethod · 0.80
current_token_kindMethod · 0.80
expectMethod · 0.80
take_thin_vecMethod · 0.80
validate_argumentsMethod · 0.80

Tested by

no test coverage detected