Skip to content

Commit

Permalink
support async function within object literal (#4424)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlamsl authored Dec 20, 2020
1 parent 8ce3c7d commit b7c49b7
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 19 deletions.
50 changes: 34 additions & 16 deletions lib/parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -1482,7 +1482,39 @@ function parse($TEXT, options) {
}));
continue;
}
if (!is("punc", ":") && start.type == "name") switch (key) {
if (is("punc", ":")) {
next();
a.push(new AST_ObjectKeyVal({
start: start,
key: key,
value: maybe_assign(),
end: prev(),
}));
continue;
}
if (is("punc", ",") || is("punc", "}")) {
a.push(new AST_ObjectKeyVal({
start: start,
key: key,
value: _make_symbol(AST_SymbolRef, start),
end: prev(),
}));
continue;
}
if (start.type == "name") switch (key) {
case "async":
key = as_property_key();
var func_start = S.token;
var func = function_(AST_AsyncFunction);
func.start = func_start;
func.end = prev();
a.push(new AST_ObjectKeyVal({
start: start,
key: key,
value: func,
end: prev(),
}));
continue;
case "get":
a.push(new AST_ObjectGetter({
start: start,
Expand All @@ -1499,22 +1531,8 @@ function parse($TEXT, options) {
end: prev(),
}));
continue;
default:
a.push(new AST_ObjectKeyVal({
start: start,
key: key,
value: _make_symbol(AST_SymbolRef, start),
end: prev(),
}));
continue;
}
expect(":");
a.push(new AST_ObjectKeyVal({
start: start,
key: key,
value: maybe_assign(),
end: prev(),
}));
unexpected();
}
next();
return new AST_Object({ properties: a });
Expand Down
21 changes: 21 additions & 0 deletions test/compress/async.js
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,27 @@ negate_iife: {
node_version: ">=8"
}

object_function: {
options = {
properties: true,
side_effects: true,
}
input: {
({
async f() {
console.log("PASS");
},
}).f();
}
expect: {
(async function() {
console.log("PASS");
})();
}
expect_stdout: "PASS"
node_version: ">=8"
}

collapse_vars_1: {
options = {
collapse_vars: true,
Expand Down
23 changes: 23 additions & 0 deletions test/compress/objects.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,29 @@ keep_computed_key: {
node_version: ">=4"
}

shorthand_keywords: {
options = {
evaluate: true,
reduce_vars: true,
toplevel: true,
unsafe: true,
unused: true,
}
input: {
var async = 1, get = 2, set = 3, o = {
async,
get,
set,
};
console.log(o.async, o.get, o.set);
}
expect: {
console.log(1, 2, 3);
}
expect_stdout: "1 2 3"
node_version: ">=6"
}

issue_4269_1: {
options = {
evaluate: true,
Expand Down
10 changes: 7 additions & 3 deletions test/ufuzz/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -1262,13 +1262,14 @@ function createObjectKey(recurmax, stmtDepth, canThrow) {
function createObjectFunction(recurmax, stmtDepth, canThrow) {
var nameLenBefore = VAR_NAMES.length;
var save_async = async;
async = SUPPORT.async && rng(50) == 0;
var s;
createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) {
switch (rng(SUPPORT.computed_key ? 3 : 2)) {
case 0:
var name = createObjectKey(recurmax, stmtDepth, canThrow);
async = false;
s = [
"get " + createObjectKey(recurmax, stmtDepth, canThrow) + "(){",
"get " + name + "(){",
strictMode(),
defns(),
_createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
Expand All @@ -1282,6 +1283,7 @@ function createObjectFunction(recurmax, stmtDepth, canThrow) {
do {
prop2 = getDotKey();
} while (prop1 == prop2);
async = false;
s = [
"set " + prop1 + "(" + createVarName(MANDATORY) + "){",
strictMode(),
Expand All @@ -1292,8 +1294,10 @@ function createObjectFunction(recurmax, stmtDepth, canThrow) {
];
break;
default:
var name = createObjectKey(recurmax, stmtDepth, canThrow);
async = SUPPORT.async && rng(50) == 0;
s = [
createObjectKey(recurmax, stmtDepth, canThrow) + "(" + createParams(save_async, NO_DUPLICATE) + "){",
(async ? "async " : "") + name + "(" + createParams(save_async, NO_DUPLICATE) + "){",
strictMode(),
defns(),
_createStatements(3, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
Expand Down

0 comments on commit b7c49b7

Please sign in to comment.