improve `if_return` (#2558)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 6 Dec 2017 17:01:52 +0000 (01:01 +0800)
committerGitHub <noreply@github.com>
Wed, 6 Dec 2017 17:01:52 +0000 (01:01 +0800)
`return void x()` => `x()`

lib/compress.js
test/compress/return_undefined.js

index 914fdd0..3f0414e 100644 (file)
@@ -1211,10 +1211,19 @@ merge(Compressor.prototype, {
                 var stat = statements[i];
                 var next = statements[i + 1];
 
-                if (in_lambda && stat instanceof AST_Return && !stat.value && !next) {
-                    CHANGED = true;
-                    statements.length--;
-                    continue;
+                if (in_lambda && !next && stat instanceof AST_Return) {
+                    if (!stat.value) {
+                        CHANGED = true;
+                        statements.length--;
+                        continue;
+                    }
+                    if (stat.value instanceof AST_UnaryPrefix && stat.value.operator == "void") {
+                        CHANGED = true;
+                        statements[i] = make_node(AST_SimpleStatement, stat, {
+                            body: stat.value.expression
+                        });
+                        continue;
+                    }
                 }
 
                 if (stat instanceof AST_If) {
@@ -1301,9 +1310,16 @@ merge(Compressor.prototype, {
                         && prev instanceof AST_If && prev.body instanceof AST_Return
                         && i + 2 == statements.length && next instanceof AST_SimpleStatement) {
                         CHANGED = true;
-                        statements.push(make_node(AST_Return, next, {
-                            value: null
-                        }).transform(compressor));
+                        stat = stat.clone();
+                        stat.alternative = make_node(AST_BlockStatement, next, {
+                            body: [
+                                next,
+                                make_node(AST_Return, next, {
+                                    value: null
+                                })
+                            ]
+                        });
+                        statements.splice(i, 2, stat.transform(compressor));
                         continue;
                     }
                 }
index 9662aa5..4d2b425 100644 (file)
@@ -122,3 +122,25 @@ return_undefined: {
         }
     }
 }
+
+return_void: {
+    options = {
+        if_return: true,
+        inline: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        function f() {
+            function g() {
+                h();
+            }
+            return g();
+        }
+    }
+    expect: {
+        function f() {
+            h();
+        }
+    }
+}