https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries
(&mut self)
| 1661 | |
| 1662 | // https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries |
| 1663 | fn parse_comp_for(&mut self) -> Result<Vec<Comprehension>, ParsingError> { |
| 1664 | // if current token is async |
| 1665 | let node = self.start_node(); |
| 1666 | let is_async = self.eat(Kind::Async); |
| 1667 | |
| 1668 | let mut generators = vec![]; |
| 1669 | loop { |
| 1670 | self.expect(Kind::For)?; |
| 1671 | let target = self.parse_target_list()?; |
| 1672 | self.expect(Kind::In)?; |
| 1673 | let iter = self.parse_or_test()?; |
| 1674 | let ifs = if self.eat(Kind::If) { |
| 1675 | let mut ifs = vec![]; |
| 1676 | loop { |
| 1677 | ifs.push(self.parse_or_test()?); |
| 1678 | if !self.eat(Kind::If) { |
| 1679 | break; |
| 1680 | } |
| 1681 | } |
| 1682 | ifs |
| 1683 | } else { |
| 1684 | vec![] |
| 1685 | }; |
| 1686 | generators.push(Comprehension { |
| 1687 | node: self.finish_node(node), |
| 1688 | target, |
| 1689 | iter, |
| 1690 | ifs, |
| 1691 | is_async, |
| 1692 | }); |
| 1693 | if !matches!(self.cur_kind(), Kind::For) { |
| 1694 | break; |
| 1695 | } |
| 1696 | } |
| 1697 | Ok(generators) |
| 1698 | } |
| 1699 | |
| 1700 | // https://docs.python.org/3/reference/simple_stmts.html#grammar-token-python-grammar-target_list |
| 1701 | fn parse_target_list(&mut self) -> Result<Expression, ParsingError> { |
no test coverage detected