Parses a single expression. This is to be used for [`Mode::Expression`]. ## Recovery After parsing a single expression, an error is reported and all remaining tokens are dropped by the parser.
(&mut self)
| 179 | /// After parsing a single expression, an error is reported and all remaining tokens are |
| 180 | /// dropped by the parser. |
| 181 | fn parse_single_expression(&mut self) -> ModExpression { |
| 182 | let start = self.node_start(); |
| 183 | let parsed_expr = self.parse_expression_list(ExpressionContext::default()); |
| 184 | |
| 185 | // All remaining newlines are actually going to be non-logical newlines. |
| 186 | self.eat(TokenKind::Newline); |
| 187 | |
| 188 | if !self.at(TokenKind::EndOfFile) { |
| 189 | self.add_error( |
| 190 | ParseErrorType::UnexpectedExpressionToken, |
| 191 | self.current_token_range(), |
| 192 | ); |
| 193 | |
| 194 | // TODO(dhruvmanila): How should error recovery work here? Just truncate after the expression? |
| 195 | let mut progress = ParserProgress::default(); |
| 196 | loop { |
| 197 | progress.assert_progressing(self); |
| 198 | if self.at(TokenKind::EndOfFile) { |
| 199 | break; |
| 200 | } |
| 201 | self.bump_any(); |
| 202 | } |
| 203 | } |
| 204 | |
| 205 | self.bump(TokenKind::EndOfFile); |
| 206 | |
| 207 | ModExpression { |
| 208 | body: Box::new(parsed_expr.expr), |
| 209 | range: self.node_range(start), |
| 210 | node_index: AtomicNodeIndex::NONE, |
| 211 | } |
| 212 | } |
| 213 | |
| 214 | /// Parses a Python module. |
| 215 | /// |
no test coverage detected