support async function within object literal (#4424)

This commit is contained in:
Alex Lam S.L
2020-12-20 00:19:04 +00:00
committed by GitHub
parent 8ce3c7d70f
commit b7c49b72b3
4 changed files with 85 additions and 19 deletions

View File

@@ -1482,7 +1482,39 @@ function parse($TEXT, options) {
})); }));
continue; 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": case "get":
a.push(new AST_ObjectGetter({ a.push(new AST_ObjectGetter({
start: start, start: start,
@@ -1499,22 +1531,8 @@ function parse($TEXT, options) {
end: prev(), end: prev(),
})); }));
continue; continue;
default:
a.push(new AST_ObjectKeyVal({
start: start,
key: key,
value: _make_symbol(AST_SymbolRef, start),
end: prev(),
}));
continue;
} }
expect(":"); unexpected();
a.push(new AST_ObjectKeyVal({
start: start,
key: key,
value: maybe_assign(),
end: prev(),
}));
} }
next(); next();
return new AST_Object({ properties: a }); return new AST_Object({ properties: a });

View File

@@ -143,6 +143,27 @@ negate_iife: {
node_version: ">=8" 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: { collapse_vars_1: {
options = { options = {
collapse_vars: true, collapse_vars: true,

View File

@@ -257,6 +257,29 @@ keep_computed_key: {
node_version: ">=4" 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: { issue_4269_1: {
options = { options = {
evaluate: true, evaluate: true,

View File

@@ -1262,13 +1262,14 @@ function createObjectKey(recurmax, stmtDepth, canThrow) {
function createObjectFunction(recurmax, stmtDepth, canThrow) { function createObjectFunction(recurmax, stmtDepth, canThrow) {
var nameLenBefore = VAR_NAMES.length; var nameLenBefore = VAR_NAMES.length;
var save_async = async; var save_async = async;
async = SUPPORT.async && rng(50) == 0;
var s; var s;
createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) { createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) {
switch (rng(SUPPORT.computed_key ? 3 : 2)) { switch (rng(SUPPORT.computed_key ? 3 : 2)) {
case 0: case 0:
var name = createObjectKey(recurmax, stmtDepth, canThrow);
async = false;
s = [ s = [
"get " + createObjectKey(recurmax, stmtDepth, canThrow) + "(){", "get " + name + "(){",
strictMode(), strictMode(),
defns(), defns(),
_createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth), _createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
@@ -1282,6 +1283,7 @@ function createObjectFunction(recurmax, stmtDepth, canThrow) {
do { do {
prop2 = getDotKey(); prop2 = getDotKey();
} while (prop1 == prop2); } while (prop1 == prop2);
async = false;
s = [ s = [
"set " + prop1 + "(" + createVarName(MANDATORY) + "){", "set " + prop1 + "(" + createVarName(MANDATORY) + "){",
strictMode(), strictMode(),
@@ -1292,8 +1294,10 @@ function createObjectFunction(recurmax, stmtDepth, canThrow) {
]; ];
break; break;
default: default:
var name = createObjectKey(recurmax, stmtDepth, canThrow);
async = SUPPORT.async && rng(50) == 0;
s = [ s = [
createObjectKey(recurmax, stmtDepth, canThrow) + "(" + createParams(save_async, NO_DUPLICATE) + "){", (async ? "async " : "") + name + "(" + createParams(save_async, NO_DUPLICATE) + "){",
strictMode(), strictMode(),
defns(), defns(),
_createStatements(3, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth), _createStatements(3, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),