1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 18:08:12 +00:00

LibJS: Add support for binding patterns in catch clauses

`try { ... } catch({a=foo}) {}` is valid, and now we parse and evaluate
it correctly :^)
This commit is contained in:
Ali Mohammad Pur 2021-07-11 15:15:38 +04:30 committed by Linus Groh
parent 1a9518ebe3
commit 77a5144264
4 changed files with 73 additions and 15 deletions

View file

@ -2059,15 +2059,34 @@ NonnullRefPtr<CatchClause> Parser::parse_catch_clause()
auto rule_start = push_start();
consume(TokenType::Catch);
String parameter;
FlyString parameter;
RefPtr<BindingPattern> pattern_parameter;
auto should_expect_parameter = false;
if (match(TokenType::ParenOpen)) {
should_expect_parameter = true;
consume();
parameter = consume(TokenType::Identifier).value();
if (match_identifier_name())
parameter = parse_identifier()->string();
else
pattern_parameter = parse_binding_pattern();
consume(TokenType::ParenClose);
}
if (should_expect_parameter && parameter.is_empty() && !pattern_parameter)
syntax_error("Expected an identifier or a binding pattern");
auto body = parse_block_statement();
return create_ast_node<CatchClause>({ m_state.current_token.filename(), rule_start.position(), position() }, parameter, move(body));
if (pattern_parameter) {
return create_ast_node<CatchClause>(
{ m_state.current_token.filename(), rule_start.position(), position() },
pattern_parameter.release_nonnull(),
move(body));
}
return create_ast_node<CatchClause>(
{ m_state.current_token.filename(), rule_start.position(), position() },
move(parameter),
move(body));
}
NonnullRefPtr<IfStatement> Parser::parse_if_statement()