Parses an argument list. # Panics If the parser isn't positioned at a `(` token. See:
(&mut self, context: ArgumentsContext)
| 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() |
no test coverage detected