https://docs.python.org/3/reference/expressions.html#expression-lists
(
&mut self,
node: Node,
first_elm: Expression,
)
| 2871 | |
| 2872 | // https://docs.python.org/3/reference/expressions.html#expression-lists |
| 2873 | fn parse_starred_expression( |
| 2874 | &mut self, |
| 2875 | node: Node, |
| 2876 | first_elm: Expression, |
| 2877 | ) -> Result<Expression, ParsingError> { |
| 2878 | let mut elements = vec![]; |
| 2879 | // if tuple has one element but there's a comma after |
| 2880 | // it, it's a tuple |
| 2881 | let mut seen_comma = false; |
| 2882 | elements.push(first_elm); |
| 2883 | while !self.at(Kind::Eof) && !self.at(Kind::RightParen) { |
| 2884 | self.expect(Kind::Comma)?; |
| 2885 | seen_comma = true; |
| 2886 | if self.at(Kind::RightParen) { |
| 2887 | break; |
| 2888 | } |
| 2889 | let expr = self.parse_starred_item()?; |
| 2890 | elements.push(expr); |
| 2891 | } |
| 2892 | if elements.len() == 1 && !seen_comma { |
| 2893 | self.bump(Kind::RightParen); |
| 2894 | let expr = elements.pop().unwrap(); |
| 2895 | if let Expression::Name(name) = expr { |
| 2896 | return Ok(Expression::Name(Box::new(Name { |
| 2897 | node: name.node, |
| 2898 | id: name.id, |
| 2899 | parenthesized: true, |
| 2900 | }))); |
| 2901 | } else { |
| 2902 | return Ok(expr); |
| 2903 | } |
| 2904 | } |
| 2905 | self.expect(Kind::RightParen)?; |
| 2906 | Ok(Expression::Tuple(Box::new(Tuple { |
| 2907 | node: self.finish_node(node), |
| 2908 | elements, |
| 2909 | }))) |
| 2910 | } |
| 2911 | |
| 2912 | // https://docs.python.org/3/reference/expressions.html#slicings |
| 2913 | // Closing will be consumed by this function |
no test coverage detected