enhance `if_return` (#4164)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 2 Oct 2020 08:10:25 +0000 (09:10 +0100)
committerGitHub <noreply@github.com>
Fri, 2 Oct 2020 08:10:25 +0000 (16:10 +0800)
lib/compress.js
test/compress/if_return.js
test/compress/issue-1052.js

index dfe444a..df797bf 100644 (file)
@@ -2150,7 +2150,9 @@ merge(Compressor.prototype, {
         function handle_if_return(statements, compressor) {
             var self = compressor.self();
             var parent = compressor.parent();
-            var in_lambda = self instanceof AST_Lambda;
+            var in_lambda = last_of(function(node) {
+                return node instanceof AST_Lambda;
+            });
             var in_iife = in_lambda && parent && parent.TYPE == "Call";
             var multiple_if_returns = has_multiple_if_returns(statements);
             for (var i = statements.length; --i >= 0;) {
@@ -2253,7 +2255,7 @@ merge(Compressor.prototype, {
                     }
                     //---
                     // if (foo()) return x; return y; => return foo() ? x : y;
-                    if ((in_bool || value) && !stat.alternative && next instanceof AST_Return) {
+                    if (!stat.alternative && next instanceof AST_Return) {
                         CHANGED = true;
                         stat = stat.clone();
                         stat.alternative = next;
@@ -2323,14 +2325,21 @@ merge(Compressor.prototype, {
                 return true;
             }
 
-            function match_target(target) {
+            function last_of(predicate) {
                 var block = self, stat, level = 0;
                 do {
                     do {
-                        if (block === target) return true;
+                        if (predicate(block)) return true;
                         block = compressor.parent(level++);
                     } while (block instanceof AST_If && (stat = block));
-                } while (block instanceof AST_BlockStatement && is_last_statement(block.body, stat));
+                } while ((block instanceof AST_BlockStatement || block instanceof AST_Scope)
+                    && is_last_statement(block.body, stat));
+            }
+
+            function match_target(target) {
+                return last_of(function(node) {
+                    return node === target;
+                });
             }
 
             function can_merge_flow(ab) {
index 90ae121..28e6a57 100644 (file)
@@ -663,3 +663,88 @@ nested_if_continue: {
         "even 21",
     ]
 }
+
+nested_if_return: {
+    options = {
+        conditionals: true,
+        if_return: true,
+    }
+    input: {
+        function f() {
+            if (A) {
+                if (B)
+                    return B;
+                if (C)
+                    return D;
+                if (E)
+                    return F;
+                if (G)
+                    return H;
+                if (I) {
+                    if (J)
+                        return K;
+                    return;
+                }
+                if (L) {
+                    if (M)
+                        return;
+                    return N;
+                }
+            }
+        }
+    }
+    expect: {
+        function f() {
+            if (A)
+                return B || (C ? D : E ? F : G ? H : I ? J ? K : void 0 : L && !M ? N : void 0);
+        }
+    }
+}
+
+issue_866_1: {
+    options = {
+        conditionals: true,
+        if_return: true,
+        sequences: false,
+    };
+    input: {
+        function f(a) {
+            if (a)
+                return "";
+            console.log(a);
+        }
+    }
+    expect: {
+        function f(a) {
+            if (a)
+                return "";
+            console.log(a);
+        }
+    }
+}
+
+issue_866_2: {
+    options = {
+        conditionals: true,
+        if_return: true,
+        sequences: true,
+    }
+    input: {
+        (function() {
+            if (a)
+                if (b)
+                    c;
+                else
+                    return d;
+        })();
+    }
+    expect: {
+        (function() {
+            if (a) {
+                if (!b)
+                    return d;
+                c;
+            }
+        })();
+    }
+}
index 30a563f..cbdd1cb 100644 (file)
@@ -16,7 +16,7 @@ multiple_functions: {
         ( function() {
             // NOTE: other compression steps will reduce this
             // down to just `window`.
-            if ( window );
+            if ( !window );
             function f() {}
             function g() {}
         } )();
@@ -38,7 +38,7 @@ single_function: {
     }
     expect: {
         ( function() {
-            if ( window );
+            if ( !window );
             function f() {}
         } )();
     }
@@ -67,7 +67,7 @@ deeply_nested: {
             // NOTE: other compression steps will reduce this
             // down to just `window`.
             if ( window )
-                if (document);
+                if ( !document );
             function f() {}
             function g() {}
             function h() {}