Parses a sequence of clauses. The parser only continues for as long as it sees the token indicating the start of the specific clause. Unlike [`Parser::parse_list`], this method does not perform error recovery when the next token is not a list terminator or the start of a list element. The special method is necessary because Python uses indentation over explicit delimiters to indicate the end of
(&mut self, clause: Clause, mut parse_clause: impl FnMut(&mut Parser<'src>))
| 4018 | /// `Else`) to the recovery context so that expression recovery stops when it encounters an |
| 4019 | /// `else` token. |
| 4020 | fn parse_clauses(&mut self, clause: Clause, mut parse_clause: impl FnMut(&mut Parser<'src>)) { |
| 4021 | let mut progress = ParserProgress::default(); |
| 4022 | |
| 4023 | let recovery_kind = match clause { |
| 4024 | Clause::ElIf => RecoveryContextKind::Elif, |
| 4025 | Clause::Except => RecoveryContextKind::Except, |
| 4026 | _ => unreachable!("Clause is not supported"), |
| 4027 | }; |
| 4028 | |
| 4029 | let saved_context = self.recovery_context; |
| 4030 | self.recovery_context = self |
| 4031 | .recovery_context |
| 4032 | .union(RecoveryContext::from_kind(recovery_kind)); |
| 4033 | |
| 4034 | while recovery_kind.is_list_element(self) { |
| 4035 | progress.assert_progressing(self); |
| 4036 | |
| 4037 | parse_clause(self); |
| 4038 | } |
| 4039 | |
| 4040 | self.recovery_context = saved_context; |
| 4041 | } |
| 4042 | } |
| 4043 | |
| 4044 | #[derive(Copy, Clone)] |
no test coverage detected