enhance if_return (#4164)

This commit is contained in:
Alex Lam S.L
2020-10-02 09:10:25 +01:00
committed by GitHub
parent 090ee895e1
commit 47a5e6e17a
3 changed files with 102 additions and 8 deletions

View File

@@ -2150,7 +2150,9 @@ merge(Compressor.prototype, {
function handle_if_return(statements, compressor) { function handle_if_return(statements, compressor) {
var self = compressor.self(); var self = compressor.self();
var parent = compressor.parent(); 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 in_iife = in_lambda && parent && parent.TYPE == "Call";
var multiple_if_returns = has_multiple_if_returns(statements); var multiple_if_returns = has_multiple_if_returns(statements);
for (var i = statements.length; --i >= 0;) { 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 (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; CHANGED = true;
stat = stat.clone(); stat = stat.clone();
stat.alternative = next; stat.alternative = next;
@@ -2323,14 +2325,21 @@ merge(Compressor.prototype, {
return true; return true;
} }
function match_target(target) { function last_of(predicate) {
var block = self, stat, level = 0; var block = self, stat, level = 0;
do { do {
do { do {
if (block === target) return true; if (predicate(block)) return true;
block = compressor.parent(level++); block = compressor.parent(level++);
} while (block instanceof AST_If && (stat = block)); } 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) { function can_merge_flow(ab) {

View File

@@ -663,3 +663,88 @@ nested_if_continue: {
"even 21", "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;
}
})();
}
}

View File

@@ -16,7 +16,7 @@ multiple_functions: {
( function() { ( function() {
// NOTE: other compression steps will reduce this // NOTE: other compression steps will reduce this
// down to just `window`. // down to just `window`.
if ( window ); if ( !window );
function f() {} function f() {}
function g() {} function g() {}
} )(); } )();
@@ -38,7 +38,7 @@ single_function: {
} }
expect: { expect: {
( function() { ( function() {
if ( window ); if ( !window );
function f() {} function f() {}
} )(); } )();
} }
@@ -67,7 +67,7 @@ deeply_nested: {
// NOTE: other compression steps will reduce this // NOTE: other compression steps will reduce this
// down to just `window`. // down to just `window`.
if ( window ) if ( window )
if (document); if ( !document );
function f() {} function f() {}
function g() {} function g() {}
function h() {} function h() {}