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