support async function within object literal (#4424)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 20 Dec 2020 00:19:04 +0000 (00:19 +0000)
committerGitHub <noreply@github.com>
Sun, 20 Dec 2020 00:19:04 +0000 (08:19 +0800)
lib/parse.js
test/compress/async.js
test/compress/objects.js
test/ufuzz/index.js

index 3b7d15c..27fa042 100644 (file)
@@ -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 });
index d73bba4..ffd941c 100644 (file)
@@ -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,
index d35f153..67acefd 100644 (file)
@@ -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,
index 77a69a5..8fce55d 100644 (file)
@@ -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),