https://262.ecma-international.org/12.0/#prod-Statement AssignmentExpression ::= ( LeftHandSideExpression AssignmentOperator AssignmentExpression | ConditionalExpression ) Expression ::= AssignmentExpression ( "," AssignmentExpression ) VariableStatement ::= "var" VariableDeclarationList ( ";" )? ExpressionStatement ::= Expression ( ";" )? ReturnStatement ::= "return" ( Expression )? ( ";" )?
(&mut self)
| 383 | /// |
| 384 | /// Statement ::= ExpressionStatement | VariableStatement | ReturnStatement |
| 385 | fn statement(&mut self) -> Option<Rc<Node>> { |
| 386 | let t = match self.t.peek() { |
| 387 | Some(t) => t, |
| 388 | None => return None, |
| 389 | }; |
| 390 | |
| 391 | let node = match t { |
| 392 | Token::Keyword(keyword) => { |
| 393 | if keyword == "var" { |
| 394 | // consume "var" |
| 395 | assert!(self.t.next().is_some()); |
| 396 | |
| 397 | self.variable_declaration() |
| 398 | } else if keyword == "return" { |
| 399 | // consume "return" |
| 400 | assert!(self.t.next().is_some()); |
| 401 | |
| 402 | Node::new_return_statement(self.assignment_expression()) |
| 403 | } else { |
| 404 | None |
| 405 | } |
| 406 | } |
| 407 | _ => Node::new_expression_statement(self.assignment_expression()), |
| 408 | }; |
| 409 | |
| 410 | if let Some(Token::Punctuator(c)) = self.t.peek() { |
| 411 | // consume ';' |
| 412 | if c == &';' { |
| 413 | assert!(self.t.next().is_some()); |
| 414 | } |
| 415 | } |
| 416 | |
| 417 | node |
| 418 | } |
| 419 | |
| 420 | /// FunctionBody ::= "{" ( SourceElements )? "}" |
| 421 | fn function_body(&mut self) -> Option<Rc<Node>> { |
no test coverage detected