diff --git a/lib/compress.js b/lib/compress.js index 77de5946..f6177743 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2332,6 +2332,15 @@ merge(Compressor.prototype, { } } + // x=y?y:z --> x=y||z + if (self.condition.equivalent_to(consequent) + && !self.condition.has_side_effects(compressor)) { + return make_node(AST_Binary, self.condition, { + left: self.condition, + operator: "||", + right: alternative + }); + } return self; }); diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index c20297aa..ab4f2512 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -293,3 +293,38 @@ cond_7: { } } +cond_8: { + options = { + conditionals: true, + evaluate : true + }; + input: { + // compress these + a = condition ? condition : b; + + if (condition) { + a = condition; + } else { + a = b; + } + + a = condition ? condition : b(); + + // Don't compress conditions that have side effects + if (condition()) { + a = condition(); + } else { + a = b; + } + + a = condition() ? condition() : b; + + } + expect: { + a = condition || b; + a = condition || b; + a = condition || b(); + a = condition() ? condition() : b; + a = condition() ? condition() : b; + } +} \ No newline at end of file