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)
| 152 | /// After parsing a single expression, an error is reported and all remaining tokens are |
| 153 | /// dropped by the parser. |
| 154 | fn parse_single_expression(&mut self) -> ModExpression { |
| 155 | let start = self.node_start(); |
| 156 | let parsed_expr = self.parse_expression_list(ExpressionContext::default()); |
| 157 | |
| 158 | // All remaining newlines are actually going to be non-logical newlines. |
| 159 | self.eat(TokenKind::Newline); |
| 160 | |
| 161 | if !self.at(TokenKind::EndOfFile) { |
| 162 | self.add_error( |
| 163 | ParseErrorType::UnexpectedExpressionToken, |
| 164 | self.current_token_range(), |
| 165 | ); |
| 166 | |
| 167 | // TODO(dhruvmanila): How should error recovery work here? Just truncate after the expression? |
| 168 | let mut progress = ParserProgress::default(); |
| 169 | loop { |
| 170 | progress.assert_progressing(self); |
| 171 | if self.at(TokenKind::EndOfFile) { |
| 172 | break; |
| 173 | } |
| 174 | self.bump_any(); |
| 175 | } |
| 176 | } |
| 177 | |
| 178 | self.bump(TokenKind::EndOfFile); |
| 179 | |
| 180 | ModExpression { |
| 181 | body: Box::new(parsed_expr.expr), |
| 182 | range: self.node_range(start), |
| 183 | node_index: AtomicNodeIndex::NONE, |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | /// Parses a Python module. |
| 188 | /// |
no test coverage detected