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

Method parse_arguments

crates/ruff_python_parser/src/parser/expression.rs:807–959  ·  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

805 ///
806 /// See: <https://docs.python.org/3/reference/expressions.html#grammar-token-python-grammar-argument_list>
807 pub(super) fn parse_arguments(&mut self, context: ArgumentsContext) -> ast::Arguments {
808 let start = self.node_start();
809 self.bump(TokenKind::Lpar);
810
811 if self.eat(TokenKind::Rpar) {
812 return ast::Arguments {
813 range: self.node_range(start),
814 node_index: AtomicNodeIndex::NONE,
815 args: Box::default(),
816 keywords: ThinVec::default(),
817 };
818 }
819
820 let args_snapshot = self.expr_scratch.snapshot();
821 let keywords_snapshot = self.keyword_scratch.snapshot();
822 let mut seen_keyword_argument = false; // foo = 1
823 let mut seen_keyword_unpacking = false; // **foo
824
825 let has_trailing_comma =
826 self.parse_comma_separated_list(RecoveryContextKind::Arguments, |parser| {
827 let argument_start = parser.node_start();
828 if parser.eat(TokenKind::DoubleStar) {
829 let value = parser.parse_conditional_expression_or_higher();
830
831 parser.keyword_scratch.push(ast::Keyword {
832 arg: None,
833 value: value.expr,
834 range: parser.node_range(argument_start),
835 node_index: AtomicNodeIndex::NONE,
836 });
837
838 seen_keyword_unpacking = true;
839 } else {
840 let start = parser.node_start();
841 let mut parsed_expr = parser
842 .parse_named_expression_or_higher(ExpressionContext::starred_conditional());
843
844 match parser.current_token_kind() {
845 TokenKind::Async | TokenKind::For => {
846 if parsed_expr.is_unparenthesized_starred_expr() {
847 parser.add_unsupported_syntax_error(
848 UnsupportedSyntaxErrorKind::UnpackingInComprehension(
849 ComprehensionUnpackingKind::IterableInGenerator,
850 ),
851 parsed_expr.range(),
852 );
853 }
854
855 parsed_expr = Expr::Generator(parser.parse_generator_expression(
856 parsed_expr.expr,
857 start,
858 Parenthesized::No,
859 ))
860 .into();
861 }
862 _ => {
863 if seen_keyword_unpacking
864 && 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