Parses a `yield` expression. # Panics If the parser isn't positioned at a `yield` token. See:
(&mut self)
| 2765 | /// |
| 2766 | /// See: <https://docs.python.org/3/reference/expressions.html#yield-expressions> |
| 2767 | fn parse_yield_expression(&mut self) -> Expr { |
| 2768 | let start = self.node_start(); |
| 2769 | self.bump(TokenKind::Yield); |
| 2770 | |
| 2771 | if self.eat(TokenKind::From) { |
| 2772 | return self.parse_yield_from_expression(start); |
| 2773 | } |
| 2774 | |
| 2775 | let value = self.at_expr().then(|| { |
| 2776 | let parsed_expr = self.parse_expression_list(ExpressionContext::starred_bitwise_or()); |
| 2777 | |
| 2778 | // test_ok iter_unpack_yield_py37 |
| 2779 | // # parse_options: {"target-version": "3.7"} |
| 2780 | // rest = (4, 5, 6) |
| 2781 | // def g(): yield (1, 2, 3, *rest) |
| 2782 | |
| 2783 | // test_ok iter_unpack_yield_py38 |
| 2784 | // # parse_options: {"target-version": "3.8"} |
| 2785 | // rest = (4, 5, 6) |
| 2786 | // def g(): yield 1, 2, 3, *rest |
| 2787 | // def h(): yield 1, (yield 2, *rest), 3 |
| 2788 | |
| 2789 | // test_err iter_unpack_yield_py37 |
| 2790 | // # parse_options: {"target-version": "3.7"} |
| 2791 | // rest = (4, 5, 6) |
| 2792 | // def g(): yield 1, 2, 3, *rest |
| 2793 | // def h(): yield 1, (yield 2, *rest), 3 |
| 2794 | self.check_tuple_unpacking( |
| 2795 | &parsed_expr, |
| 2796 | UnsupportedSyntaxErrorKind::StarTuple(StarTupleKind::Yield), |
| 2797 | ); |
| 2798 | |
| 2799 | Box::new(parsed_expr.expr) |
| 2800 | }); |
| 2801 | |
| 2802 | Expr::Yield(ast::ExprYield { |
| 2803 | value, |
| 2804 | range: self.node_range(start), |
| 2805 | node_index: AtomicNodeIndex::NONE, |
| 2806 | }) |
| 2807 | } |
| 2808 | |
| 2809 | /// Parses a `yield from` expression. |
| 2810 | /// |
no test coverage detected