Skip to content

Commit

Permalink
LibJS: Add object literal method shorthand
Browse files Browse the repository at this point in the history
  • Loading branch information
mattco98 authored and awesomekling committed May 1, 2020
1 parent 88f7f97 commit 28ef654
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
10 changes: 7 additions & 3 deletions Libraries/LibJS/Parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,9 @@ NonnullRefPtr<ObjectExpression> Parser::parse_object_expression()
continue;
}

if (need_colon || match(TokenType::Colon)) {
if (!is_spread && match(TokenType::ParenOpen)) {
property_value = parse_function_node<FunctionExpression>(false);
} else if (need_colon || match(TokenType::Colon)) {
consume(TokenType::Colon);
property_value = parse_expression(0);
}
Expand Down Expand Up @@ -756,11 +758,13 @@ NonnullRefPtr<BlockStatement> Parser::parse_block_statement()
}

template<typename FunctionNodeType>
NonnullRefPtr<FunctionNodeType> Parser::parse_function_node()
NonnullRefPtr<FunctionNodeType> 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();
Expand Down
2 changes: 1 addition & 1 deletion Libraries/LibJS/Parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class Parser {
NonnullRefPtr<Program> parse_program();

template<typename FunctionNodeType>
NonnullRefPtr<FunctionNodeType> parse_function_node();
NonnullRefPtr<FunctionNodeType> parse_function_node(bool need_function_keyword = true);

NonnullRefPtr<Statement> parse_statement();
NonnullRefPtr<BlockStatement> parse_block_statement();
Expand Down
29 changes: 29 additions & 0 deletions Libraries/LibJS/Tests/object-method-shorthand.js
Original file line number Diff line number Diff line change
@@ -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);
}

0 comments on commit 28ef654

Please sign in to comment.