MCPcopy Create free account
hub / github.com/Glyphack/enderpy / parse_if_statement

Method parse_if_statement

parser/src/parser/parser.rs:333–384  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

331 }
332
333 fn parse_if_statement(&mut self) -> Result<Statement, ParsingError> {
334 let node = self.start_node();
335 self.expect(Kind::If)?;
336 let test = self.parse_named_expression()?;
337 self.expect(Kind::Colon)?;
338 let body = self.parse_suite()?;
339 let mut orelse: Option<If> = None;
340 while self.at(Kind::Elif) {
341 let elif_node = self.start_node();
342 self.bump(Kind::Elif);
343 let elif_test = self.parse_named_expression()?;
344 self.expect(Kind::Colon)?;
345 let body = self.parse_suite()?;
346 let if_value = If {
347 node: self.finish_node(elif_node),
348 test: elif_test,
349 body,
350 orelse: vec![],
351 };
352 if let Some(val) = &mut orelse {
353 val.update_orelse(vec![Statement::IfStatement(Box::new(if_value))]);
354 } else {
355 orelse = Some(if_value);
356 }
357 }
358
359 let mut single_else_body: Option<Vec<Statement>> = None;
360 if self.eat(Kind::Else) {
361 self.expect(Kind::Colon)?;
362 let else_body = self.parse_suite()?;
363 if let Some(val) = &mut orelse {
364 val.update_orelse(else_body);
365 } else {
366 single_else_body = Some(else_body);
367 }
368 };
369
370 // if we had any else or elif statements, we need to wrap them in a vec
371 // otherwise we just return an empty vec as the else block of the if statement
372 let or_else_vec = if let Some(val) = orelse {
373 vec![Statement::IfStatement(Box::new(val))]
374 } else {
375 single_else_body.unwrap_or_default()
376 };
377
378 Ok(Statement::IfStatement(Box::new(If {
379 node: self.finish_node_chomped(node),
380 test,
381 body,
382 orelse: or_else_vec,
383 })))
384 }
385
386 fn parse_while_statement(&mut self) -> Result<Statement, ParsingError> {
387 let node = self.start_node();

Callers 1

Calls 10

start_nodeMethod · 0.80
expectMethod · 0.80
parse_suiteMethod · 0.80
atMethod · 0.80
bumpMethod · 0.80
finish_nodeMethod · 0.80
update_orelseMethod · 0.80
eatMethod · 0.80
finish_node_chompedMethod · 0.80

Tested by

no test coverage detected