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)
| 210 | /// After parsing a single expression, an error is reported and all remaining tokens are |
| 211 | /// dropped by the parser. |
| 212 | fn parse_single_expression(&mut self) -> ModExpression { |
| 213 | let start = self.node_start(); |
| 214 | let parsed_expr = self.parse_expression_list(ExpressionContext::default()); |
| 215 | |
| 216 | // All remaining newlines are actually going to be non-logical newlines. |
| 217 | self.eat(TokenKind::Newline); |
| 218 | |
| 219 | if !self.at(TokenKind::EndOfFile) { |
| 220 | self.add_error( |
| 221 | ParseErrorType::UnexpectedExpressionToken, |
| 222 | self.current_token_range(), |
| 223 | ); |
| 224 | |
| 225 | // TODO(dhruvmanila): How should error recovery work here? Just truncate after the expression? |
| 226 | let mut progress = ParserProgress::default(); |
| 227 | loop { |
| 228 | progress.assert_progressing(self); |
| 229 | if self.at(TokenKind::EndOfFile) { |
| 230 | break; |
| 231 | } |
| 232 | self.bump_any(); |
| 233 | } |
| 234 | } |
| 235 | |
| 236 | self.bump(TokenKind::EndOfFile); |
| 237 | |
| 238 | ModExpression { |
| 239 | body: Box::new(parsed_expr.expr), |
| 240 | range: self.node_range(start), |
| 241 | node_index: AtomicNodeIndex::NONE, |
| 242 | } |
| 243 | } |
| 244 | |
| 245 | /// Parses a Python module. |
| 246 | /// |
no test coverage detected