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