enhance `if_return` & `side_effects` (#4494)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 2 Jan 2021 04:39:51 +0000 (04:39 +0000)
committerGitHub <noreply@github.com>
Sat, 2 Jan 2021 04:39:51 +0000 (12:39 +0800)
lib/compress.js
test/compress/async.js

index 0a46fb2..0ab6586 100644 (file)
@@ -2600,10 +2600,18 @@ merge(Compressor.prototype, {
                         statements.splice(i, 1);
                         continue;
                     }
-                    if (stat.value instanceof AST_UnaryPrefix && stat.value.operator == "void") {
+                    var tail = stat.value.tail_node();
+                    if (tail instanceof AST_UnaryPrefix && tail.operator == "void") {
                         CHANGED = true;
+                        var body;
+                        if (tail === stat.value) {
+                            body = tail.expression;
+                        } else {
+                            body = stat.value.clone();
+                            body.expressions[body.length - 1] = tail.expression;
+                        }
                         statements[i] = make_node(AST_SimpleStatement, stat, {
-                            body: stat.value.expression
+                            body: body,
                         });
                         continue;
                     }
@@ -6642,6 +6650,13 @@ merge(Compressor.prototype, {
             return this;
         });
         def(AST_AsyncFunction, return_null);
+        def(AST_Await, function(compressor) {
+            var exp = this.expression.drop_side_effect_free(compressor);
+            if (exp === this.expression) return this;
+            var node = this.clone();
+            node.expression = exp || make_node(AST_Number, this, { value: 0 });
+            return node;
+        });
         def(AST_Binary, function(compressor, first_in_statement) {
             if (this.operator == "in" && !is_object(this.right)) {
                 var left = this.left.drop_side_effect_free(compressor, first_in_statement);
index 51aba26..4039dbb 100644 (file)
@@ -184,7 +184,7 @@ inline_await_1_trim: {
     }
     expect: {
         (async function() {
-            await 42;
+            await 0;
         })();
         console.log("PASS");
     }
@@ -228,7 +228,7 @@ inline_await_2_trim: {
     input: {
         (async function() {
             async function f(a) {
-                await a;
+                await a.log;
             }
             return await f(console);
         })();
@@ -236,7 +236,7 @@ inline_await_2_trim: {
     }
     expect: {
         (async function() {
-            await console;
+            await console.log;
         })();
         console.log("PASS");
     }
@@ -299,18 +299,22 @@ await_unary: {
         side_effects: true,
     }
     input: {
+        var a;
         (async function() {
-            console.log("PASS");
-            await +[];
-            console.log("FAIL");
+            a = "PASS";
+            await delete a.p;
+            a = "FAIL";
         })();
+        console.log(a);
     }
     expect: {
+        var a;
         (async function() {
-            console.log("PASS");
-            await +[];
-            console.log("FAIL");
+            a = "PASS";
+            await delete a.p;
+            a = "FAIL";
         })();
+        console.log(a);
     }
     expect_stdout: "PASS"
     node_version: ">=8"