parse_js/parse/
function.rs1use 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 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 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}