diff options
author | Matthew Olsson <matthewcolsson@gmail.com> | 2020-05-28 11:09:19 -0700 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-05-29 16:20:32 +0200 |
commit | 10bf4ba3dcb7bc79606b29991be497453d0e410b (patch) | |
tree | dc65cce2f0d59211f2d2fca945f8fa931ea13508 /Libraries/LibJS/Parser.cpp | |
parent | 5cd01ed79e816bb0a81c429f7efaa5de24c4b598 (diff) | |
download | serenity-10bf4ba3dcb7bc79606b29991be497453d0e410b.zip |
LibJS: Parse labelled statements
All statements now have an optional label string that can be null.
Diffstat (limited to 'Libraries/LibJS/Parser.cpp')
-rw-r--r-- | Libraries/LibJS/Parser.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index c06028f5a9..dbb1db4215 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -269,6 +269,9 @@ NonnullRefPtr<Statement> Parser::parse_statement() consume(); return create_ast_node<EmptyStatement>(); default: + auto result = try_parse_labelled_statement(); + if (!result.is_null()) + return result.release_nonnull(); if (match_expression()) { auto expr = parse_expression(0); consume_or_insert_semicolon(); @@ -383,6 +386,27 @@ RefPtr<FunctionExpression> Parser::try_parse_arrow_function_expression(bool expe return nullptr; } +RefPtr<Statement> Parser::try_parse_labelled_statement() +{ + save_state(); + ArmedScopeGuard state_rollback_guard = [&] { + load_state(); + }; + + auto identifier = consume(TokenType::Identifier).value(); + if (!match(TokenType::Colon)) + return {}; + consume(TokenType::Colon); + + if (!match_statement()) + return {}; + auto statement = parse_statement(); + + statement->set_label(identifier); + state_rollback_guard.disarm(); + return statement; +} + NonnullRefPtr<Expression> Parser::parse_primary_expression() { if (match_unary_prefixed_expression()) |