From 28ef654d13e0eb3d792007810a4dc6905121055c Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Thu, 30 Apr 2020 23:40:45 -0700 Subject: [PATCH] LibJS: Add object literal method shorthand --- Libraries/LibJS/Parser.cpp | 10 +++++-- Libraries/LibJS/Parser.h | 2 +- .../LibJS/Tests/object-method-shorthand.js | 29 +++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 Libraries/LibJS/Tests/object-method-shorthand.js diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index e1a2b8820afd7c..4982f0baea811d 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -482,7 +482,9 @@ NonnullRefPtr Parser::parse_object_expression() continue; } - if (need_colon || match(TokenType::Colon)) { + if (!is_spread && match(TokenType::ParenOpen)) { + property_value = parse_function_node(false); + } else if (need_colon || match(TokenType::Colon)) { consume(TokenType::Colon); property_value = parse_expression(0); } @@ -756,11 +758,13 @@ NonnullRefPtr Parser::parse_block_statement() } template -NonnullRefPtr Parser::parse_function_node() +NonnullRefPtr Parser::parse_function_node(bool needs_function_keyword) { ScopePusher scope(*this, ScopePusher::Var); - consume(TokenType::Function); + if (needs_function_keyword) + consume(TokenType::Function); + String name; if (FunctionNodeType::must_have_name()) { name = consume(TokenType::Identifier).value(); diff --git a/Libraries/LibJS/Parser.h b/Libraries/LibJS/Parser.h index e6df36e390c33d..8d171c46a4dc53 100644 --- a/Libraries/LibJS/Parser.h +++ b/Libraries/LibJS/Parser.h @@ -44,7 +44,7 @@ class Parser { NonnullRefPtr parse_program(); template - NonnullRefPtr parse_function_node(); + NonnullRefPtr parse_function_node(bool need_function_keyword = true); NonnullRefPtr parse_statement(); NonnullRefPtr parse_block_statement(); diff --git a/Libraries/LibJS/Tests/object-method-shorthand.js b/Libraries/LibJS/Tests/object-method-shorthand.js new file mode 100644 index 00000000000000..94c3454d84cbc0 --- /dev/null +++ b/Libraries/LibJS/Tests/object-method-shorthand.js @@ -0,0 +1,29 @@ +load("test-common.js"); + +try { + const o = { + foo: "bar", + getFoo() { + return this.foo; + }, + 12() { + return this.getFoo(); + }, + "hello friends"() { + return this.getFoo(); + }, + [4 + 10]() { + return this.getFoo(); + }, + }; + + assert(o.foo === "bar"); + assert(o.getFoo() === "bar"); + assert(o[12]() === "bar"); + assert(o["hello friends"]() === "bar"); + assert(o[14]() === "bar"); + + console.log("PASS"); +} catch (e) { + console.log("FAIL: " + e); +}