diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2020-10-02 09:10:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-02 16:10:25 +0800 |
commit | 47a5e6e17a91719dd8ee124f818e6a1996b4d668 (patch) | |
tree | 5f659e96b4fc620aad3e87b646d1a3cdb19cea78 | |
parent | 090ee895e12ff7e985a972c448b7d29f63e12696 (diff) | |
download | tracifyjs-47a5e6e17a91719dd8ee124f818e6a1996b4d668.tar.gz tracifyjs-47a5e6e17a91719dd8ee124f818e6a1996b4d668.zip |
enhance `if_return` (#4164)
-rw-r--r-- | lib/compress.js | 19 | ||||
-rw-r--r-- | test/compress/if_return.js | 85 | ||||
-rw-r--r-- | test/compress/issue-1052.js | 6 |
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() {} |