From: Alex Lam S.L Date: Wed, 10 Jan 2018 08:59:57 +0000 (+0800) Subject: enhance `conditionals` (#2758) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=09269be9745ab269acaa320db0abaed67ca06566;p=UglifyJS.git enhance `conditionals` (#2758) `x ? y || z : z` --> `x && y || z` --- diff --git a/lib/compress.js b/lib/compress.js index 406a331c..9760c546 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5278,6 +5278,20 @@ merge(Compressor.prototype, { consequent ]).optimize(compressor); } + // x ? y || z : z --> x && y || z + if (consequent instanceof AST_Binary + && consequent.operator == "||" + && consequent.right.equivalent_to(alternative)) { + return make_node(AST_Binary, self, { + operator: "||", + left: make_node(AST_Binary, self, { + operator: "&&", + left: self.condition, + right: consequent.left + }), + right: alternative + }).optimize(compressor); + } var in_bool = compressor.in_boolean_context(); if (is_true(self.consequent)) { if (is_false(self.alternative)) { diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index 7838fdbb..e37c5556 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -1224,3 +1224,46 @@ hoist_decl: { x() ? y() : z(); } } + +to_and_or: { + options = { + conditionals: true, + } + input: { + var values = [ + 0, + null, + true, + "foo", + false, + -1 / 0, + void 0, + ]; + values.forEach(function(x) { + values.forEach(function(y) { + values.forEach(function(z) { + console.log(x ? y || z : z); + }); + }); + }); + } + expect: { + var values = [ + 0, + null, + true, + "foo", + false, + -1 / 0, + void 0, + ]; + values.forEach(function(x) { + values.forEach(function(y) { + values.forEach(function(z) { + console.log(x && y || z); + }); + }); + }); + } + expect_stdout: true +}