Parses a statement that is valid after an `async` token. If the statement is not a valid `async` statement, an error will be reported and it will be parsed as a statement. See: - - - <https://docs.python.org/3/reference/compound_stmt
(&mut self)
| 2842 | /// - <https://docs.python.org/3/reference/compound_stmts.html#the-async-for-statement> |
| 2843 | /// - <https://docs.python.org/3/reference/compound_stmts.html#coroutine-function-definition> |
| 2844 | fn parse_async_statement(&mut self) -> Stmt { |
| 2845 | let async_start = self.node_start(); |
| 2846 | self.bump(TokenKind::Async); |
| 2847 | |
| 2848 | match self.current_token_kind() { |
| 2849 | // test_ok async_function_definition |
| 2850 | // async def foo(): ... |
| 2851 | TokenKind::Def => Stmt::FunctionDef(ast::StmtFunctionDef { |
| 2852 | is_async: true, |
| 2853 | ..self.parse_function_definition(DecoratorList::new(), async_start) |
| 2854 | }), |
| 2855 | |
| 2856 | // test_ok async_with_statement |
| 2857 | // async with item: ... |
| 2858 | TokenKind::With => Stmt::With(ast::StmtWith { |
| 2859 | is_async: true, |
| 2860 | ..self.parse_with_statement(async_start) |
| 2861 | }), |
| 2862 | |
| 2863 | // test_ok async_for_statement |
| 2864 | // async for target in iter: ... |
| 2865 | TokenKind::For => Stmt::For(ast::StmtFor { |
| 2866 | is_async: true, |
| 2867 | ..self.parse_for_statement(async_start) |
| 2868 | }), |
| 2869 | |
| 2870 | kind => { |
| 2871 | // test_err async_unexpected_token |
| 2872 | // async class Foo: ... |
| 2873 | // async while test: ... |
| 2874 | // async x = 1 |
| 2875 | // async async def foo(): ... |
| 2876 | // async match test: |
| 2877 | // case _: ... |
| 2878 | self.add_error( |
| 2879 | ParseErrorType::UnexpectedTokenAfterAsync(kind), |
| 2880 | self.current_token_range(), |
| 2881 | ); |
| 2882 | |
| 2883 | // Although this statement is not a valid `async` statement, |
| 2884 | // we still parse it. Guard the recursive recovery path so |
| 2885 | // `async async async ...` cannot overflow the parser stack. |
| 2886 | self.with_recursion(Self::parse_statement) |
| 2887 | } |
| 2888 | } |
| 2889 | } |
| 2890 | |
| 2891 | /// Parses a decorator list followed by a class, function or async function definition. |
| 2892 | /// |
no test coverage detected