parse_js/parse/
function.rs

1use super::ParseCtx;
2use super::Parser;
3use crate::ast::Node;
4use crate::ast::Syntax;
5use crate::error::SyntaxResult;
6use crate::token::TokenType;
7
8impl<'a> Parser<'a> {
9  // `scope` should be a newly created closure scope for this function.
10  pub fn parse_function_parameters(&mut self, ctx: ParseCtx) -> SyntaxResult<Vec<Node>> {
11    let mut parameters = Vec::new();
12    self.require(TokenType::ParenthesisOpen)?;
13    loop {
14      if self.consume_if(TokenType::ParenthesisClose)?.is_match() {
15        break;
16      };
17
18      let rest = self.consume_if(TokenType::DotDotDot)?.is_match();
19      let pattern = self.parse_pattern(ctx)?;
20      let default_value = self.consume_if(TokenType::Equals)?.and_then(|| {
21        self.parse_expr_until_either(ctx, TokenType::Comma, TokenType::ParenthesisClose)
22      })?;
23
24      // TODO Location
25      parameters.push(Node::new(pattern.loc, Syntax::ParamDecl {
26        rest,
27        pattern,
28        default_value,
29      }));
30
31      if !self.consume_if(TokenType::Comma)?.is_match() {
32        self.require(TokenType::ParenthesisClose)?;
33        break;
34      };
35    }
36    Ok(parameters)
37  }
38
39  pub fn parse_function_body(&mut self, ctx: ParseCtx) -> SyntaxResult<Node> {
40    let start = self.require(TokenType::BraceOpen)?;
41    let body = self.parse_stmts(ctx, TokenType::BraceClose)?;
42    let end = self.require(TokenType::BraceClose)?;
43    Ok(Node::new(start.loc + end.loc, Syntax::FunctionBody {
44      body,
45    }))
46  }
47}