mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 02:58:12 +00:00
LibJS: Allow try statement with only finally clause
This was a regression introduced by 9ffe45b - a TryStatement without 'catch' clause *is* allowed, if it has a 'finally' clause. It is now checked properly that at least one of both is present.
This commit is contained in:
parent
aa115fe27b
commit
d6f8c52245
2 changed files with 16 additions and 1 deletions
|
@ -1443,7 +1443,10 @@ NonnullRefPtr<TryStatement> Parser::parse_try_statement()
|
||||||
consume(TokenType::Try);
|
consume(TokenType::Try);
|
||||||
|
|
||||||
auto block = parse_block_statement();
|
auto block = parse_block_statement();
|
||||||
auto handler = parse_catch_clause();
|
|
||||||
|
RefPtr<CatchClause> handler;
|
||||||
|
if (match(TokenType::Catch))
|
||||||
|
handler = parse_catch_clause();
|
||||||
|
|
||||||
RefPtr<BlockStatement> finalizer;
|
RefPtr<BlockStatement> finalizer;
|
||||||
if (match(TokenType::Finally)) {
|
if (match(TokenType::Finally)) {
|
||||||
|
@ -1451,6 +1454,9 @@ NonnullRefPtr<TryStatement> Parser::parse_try_statement()
|
||||||
finalizer = parse_block_statement();
|
finalizer = parse_block_statement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!handler && !finalizer)
|
||||||
|
syntax_error("try statement must have a 'catch' or 'finally' clause");
|
||||||
|
|
||||||
return create_ast_node<TryStatement>(move(block), move(handler), move(finalizer));
|
return create_ast_node<TryStatement>(move(block), move(handler), move(finalizer));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -161,3 +161,12 @@ test("try/catch/finally with exception in try, catch and finally", () => {
|
||||||
expect(catchHasBeenExecuted).toBeTrue();
|
expect(catchHasBeenExecuted).toBeTrue();
|
||||||
expect(finallyHasBeenExecuted).toBeTrue();
|
expect(finallyHasBeenExecuted).toBeTrue();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("try statement must have either 'catch' or 'finally' clause", () => {
|
||||||
|
expect("try {} catch {}").toEval();
|
||||||
|
expect("try {} catch (e) {}").toEval();
|
||||||
|
expect("try {} finally {}").toEval();
|
||||||
|
expect("try {} catch {} finally {}").toEval();
|
||||||
|
expect("try {} catch (e) {} finally {}").toEval();
|
||||||
|
expect("try {}").not.toEval();
|
||||||
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue