1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-18 21:35:06 +00:00

LibJS: Add function default arguments

Adds the ability for function arguments to have default values. This
works for standard functions as well as arrow functions. Default values
are not printed in a <function>.toString() call, as nodes cannot print
their source string representation.
This commit is contained in:
Matthew Olsson 2020-05-02 11:46:39 -07:00 committed by Andreas Kling
parent 751f813f6a
commit 5e66f1900b
8 changed files with 184 additions and 35 deletions

View file

@ -279,14 +279,19 @@ RefPtr<FunctionExpression> Parser::try_parse_arrow_function_expression(bool expe
load_state();
};
Vector<FlyString> parameters;
Vector<FunctionNode::Parameter> parameters;
bool parse_failed = false;
while (true) {
if (match(TokenType::Comma)) {
consume(TokenType::Comma);
} else if (match(TokenType::Identifier)) {
auto token = consume(TokenType::Identifier);
parameters.append(token.value());
auto parameter_name = consume(TokenType::Identifier).value();
RefPtr<Expression> default_value;
if (match(TokenType::Equals)) {
consume(TokenType::Equals);
default_value = parse_expression(0);
}
parameters.append({ parameter_name, default_value });
} else if (match(TokenType::ParenClose)) {
if (expect_parens) {
consume(TokenType::ParenClose);
@ -775,10 +780,15 @@ NonnullRefPtr<FunctionNodeType> Parser::parse_function_node(bool needs_function_
name = consume(TokenType::Identifier).value();
}
consume(TokenType::ParenOpen);
Vector<FlyString> parameters;
Vector<FunctionNode::Parameter> parameters;
while (match(TokenType::Identifier)) {
auto parameter = consume(TokenType::Identifier).value();
parameters.append(parameter);
auto parameter_name = consume(TokenType::Identifier).value();
RefPtr<Expression> default_value;
if (match(TokenType::Equals)) {
consume(TokenType::Equals);
default_value = parse_expression(0);
}
parameters.append({ parameter_name, default_value });
if (match(TokenType::ParenClose)) {
break;
}
@ -1233,14 +1243,13 @@ void Parser::syntax_error(const String& message, size_t line, size_t column)
void Parser::save_state()
{
m_saved_state = m_parser_state;
m_saved_state.append(m_parser_state);
}
void Parser::load_state()
{
ASSERT(m_saved_state.has_value());
m_parser_state = m_saved_state.value();
m_saved_state.clear();
ASSERT(!m_saved_state.is_empty());
m_parser_state = m_saved_state.take_last();
}
}