aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2020-10-02 09:10:25 +0100
committerGitHub <noreply@github.com>2020-10-02 16:10:25 +0800
commit47a5e6e17a91719dd8ee124f818e6a1996b4d668 (patch)
tree5f659e96b4fc620aad3e87b646d1a3cdb19cea78
parent090ee895e12ff7e985a972c448b7d29f63e12696 (diff)
downloadtracifyjs-47a5e6e17a91719dd8ee124f818e6a1996b4d668.tar.gz
tracifyjs-47a5e6e17a91719dd8ee124f818e6a1996b4d668.zip
enhance `if_return` (#4164)
-rw-r--r--lib/compress.js19
-rw-r--r--test/compress/if_return.js85
-rw-r--r--test/compress/issue-1052.js6
3 files changed, 102 insertions, 8 deletions
diff --git a/lib/compress.js b/lib/compress.js
index dfe444ad..df797bf7 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -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) {
diff --git a/test/compress/if_return.js b/test/compress/if_return.js
index 90ae1210..28e6a57e 100644
--- a/test/compress/if_return.js
+++ b/test/compress/if_return.js
@@ -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;
+ }
+ })();
+ }
+}
diff --git a/test/compress/issue-1052.js b/test/compress/issue-1052.js
index 30a563fe..cbdd1cb7 100644
--- a/test/compress/issue-1052.js
+++ b/test/compress/issue-1052.js
@@ -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() {}