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

Method parse_arguments

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

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

Tested by

no test coverage detected