support async function within object literal (#4424)
This commit is contained in:
50
lib/parse.js
50
lib/parse.js
@@ -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,
|
||||
@@ -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 });
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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),
|
||||
@@ -1282,6 +1283,7 @@ function createObjectFunction(recurmax, stmtDepth, canThrow) {
|
||||
do {
|
||||
prop2 = getDotKey();
|
||||
} while (prop1 == prop2);
|
||||
async = false;
|
||||
s = [
|
||||
"set " + prop1 + "(" + createVarName(MANDATORY) + "){",
|
||||
strictMode(),
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user