(&mut self)
| 273 | } |
| 274 | |
| 275 | fn parse_compound_statement(&mut self) -> Result<Statement, ParsingError> { |
| 276 | match self.cur_kind() { |
| 277 | Kind::If => self.parse_if_statement(), |
| 278 | Kind::While => self.parse_while_statement(), |
| 279 | Kind::For => self.parse_for_statement(), |
| 280 | Kind::Try => self.parse_try_statement(), |
| 281 | Kind::With => self.parse_with_statement(), |
| 282 | Kind::Def => { |
| 283 | let node = self.start_node(); |
| 284 | self.bump_any(); |
| 285 | self.parse_function_definition(node, vec![], false) |
| 286 | } |
| 287 | Kind::MatrixMul => self.parse_decorated_function_def_or_class_def(), |
| 288 | Kind::Class => self.parse_class_definition(vec![], None), |
| 289 | Kind::Async => { |
| 290 | if matches!(self.peek_kind(), Ok(Kind::Def)) { |
| 291 | let node = self.start_node(); |
| 292 | self.bump_any(); |
| 293 | self.bump_any(); |
| 294 | self.parse_function_definition(node, vec![], true) |
| 295 | } else if matches!(self.peek_kind(), Ok(Kind::For)) { |
| 296 | self.parse_for_statement() |
| 297 | } else if matches!(self.peek_kind(), Ok(Kind::With)) { |
| 298 | self.parse_with_statement() |
| 299 | } else { |
| 300 | panic!(""); |
| 301 | } |
| 302 | } |
| 303 | other => { |
| 304 | // type & match are a soft keywords |
| 305 | // https://docs.python.org/3/reference/lexical_analysis.html#soft-keywords |
| 306 | let peeked = self.peek_kind()?; |
| 307 | if other == Kind::Type && peeked == Kind::Identifier { |
| 308 | self.parse_type_alias_statement() |
| 309 | } else if other == Kind::Match && matches!(peeked, Kind::Identifier | Kind::Mul) { |
| 310 | self.parse_match_statement() |
| 311 | } else { |
| 312 | self.parse_assignment_or_expression_statement() |
| 313 | } |
| 314 | } |
| 315 | } |
| 316 | } |
| 317 | |
| 318 | fn err_if_statement_not_ending_in_new_line_or_semicolon( |
| 319 | &mut self, |
no test coverage detected