Parses a `yield` expression. # Panics If the parser isn't positioned at a `yield` token. See:
(&mut self)
| 2841 | /// |
| 2842 | /// See: <https://docs.python.org/3/reference/expressions.html#yield-expressions> |
| 2843 | fn parse_yield_expression(&mut self) -> Expr { |
| 2844 | let start = self.node_start(); |
| 2845 | self.bump(TokenKind::Yield); |
| 2846 | |
| 2847 | if self.eat(TokenKind::From) { |
| 2848 | return self.parse_yield_from_expression(start); |
| 2849 | } |
| 2850 | |
| 2851 | let value = self.at_expr().then(|| { |
| 2852 | let parsed_expr = self.parse_expression_list(ExpressionContext::starred_bitwise_or()); |
| 2853 | |
| 2854 | // test_ok iter_unpack_yield_py37 |
| 2855 | // # parse_options: {"target-version": "3.7"} |
| 2856 | // rest = (4, 5, 6) |
| 2857 | // def g(): yield (1, 2, 3, *rest) |
| 2858 | |
| 2859 | // test_ok iter_unpack_yield_py38 |
| 2860 | // # parse_options: {"target-version": "3.8"} |
| 2861 | // rest = (4, 5, 6) |
| 2862 | // def g(): yield 1, 2, 3, *rest |
| 2863 | // def h(): yield 1, (yield 2, *rest), 3 |
| 2864 | |
| 2865 | // test_err iter_unpack_yield_py37 |
| 2866 | // # parse_options: {"target-version": "3.7"} |
| 2867 | // rest = (4, 5, 6) |
| 2868 | // def g(): yield 1, 2, 3, *rest |
| 2869 | // def h(): yield 1, (yield 2, *rest), 3 |
| 2870 | self.check_tuple_unpacking( |
| 2871 | &parsed_expr, |
| 2872 | UnsupportedSyntaxErrorKind::StarTuple(StarTupleKind::Yield), |
| 2873 | ); |
| 2874 | |
| 2875 | Box::new(parsed_expr.expr) |
| 2876 | }); |
| 2877 | |
| 2878 | Expr::Yield(ast::ExprYield { |
| 2879 | value, |
| 2880 | range: self.node_range(start), |
| 2881 | node_index: AtomicNodeIndex::NONE, |
| 2882 | }) |
| 2883 | } |
| 2884 | |
| 2885 | /// Parses a `yield from` expression. |
| 2886 | /// |
no test coverage detected