From e5436ca5665378d67bb228704736d1fe5fa7b6ee Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Thu, 25 Apr 2019 15:15:50 +0800 Subject: [PATCH] enhance `side_effects` (#3384) --- lib/compress.js | 12 +++++------- test/compress/conditionals.js | 36 +++++++++++++++++++++++++++++++++++ test/compress/sequences.js | 36 +++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 13fc953d..a7585a60 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4172,10 +4172,8 @@ merge(Compressor.prototype, { var right = this.right.drop_side_effect_free(compressor, first_in_statement); if (!right) return this.left.drop_side_effect_free(compressor, first_in_statement); if (lazy_op[this.operator]) { - var node; - if (right === this.right) { - node = this; - } else { + var node = this; + if (right !== node.right) { node = this.clone(); node.right = right.drop_side_effect_free(compressor); } @@ -4559,14 +4557,14 @@ merge(Compressor.prototype, { operator : "||", left : negated, right : self.body.body - }) + }).transform(compressor) }).optimize(compressor); return make_node(AST_SimpleStatement, self, { body: make_node(AST_Binary, self, { operator : "&&", left : self.condition, right : self.body.body - }) + }).transform(compressor) }).optimize(compressor); } if (self.body instanceof AST_EmptyStatement @@ -4576,7 +4574,7 @@ merge(Compressor.prototype, { operator : "||", left : self.condition, right : self.alternative.body - }) + }).transform(compressor) }).optimize(compressor); } if (self.body instanceof AST_Exit diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js index a208165f..594d956d 100644 --- a/test/compress/conditionals.js +++ b/test/compress/conditionals.js @@ -1435,3 +1435,39 @@ iife_condition: { } expect_stdout: "PASS" } + +angularjs_chain: { + options = { + conditionals: true, + passes: 2, + side_effects: true, + } + input: { + function nonComputedMember(left, right, context, create) { + var lhs = left(); + if (create && create !== 1) { + if (lhs && lhs[right] == null) { + lhs[right] = {}; + } + } + var value = lhs != null ? lhs[right] : undefined; + if (context) { + return { context: lhs, name: right, value: value }; + } else { + return value; + } + } + } + expect: { + function nonComputedMember(left, right, context, create) { + var lhs = left(); + create && 1 !== create && lhs && null == lhs[right] && (lhs[right] = {}); + var value = null != lhs ? lhs[right] : void 0; + return context ? { + context: lhs, + name: right, + value: value + } : value; + } + } +} diff --git a/test/compress/sequences.js b/test/compress/sequences.js index 29cede40..47dd4c4f 100644 --- a/test/compress/sequences.js +++ b/test/compress/sequences.js @@ -964,3 +964,39 @@ missing_link: { console.log(a); } } + +angularjs_chain: { + options = { + conditionals: true, + sequences: true, + side_effects: true, + } + input: { + function nonComputedMember(left, right, context, create) { + var lhs = left(); + if (create && create !== 1) { + if (lhs && lhs[right] == null) { + lhs[right] = {}; + } + } + var value = lhs != null ? lhs[right] : undefined; + if (context) { + return { context: lhs, name: right, value: value }; + } else { + return value; + } + } + } + expect: { + function nonComputedMember(left, right, context, create) { + var lhs = left(); + create && 1 !== create && lhs && null == lhs[right] && (lhs[right] = {}); + var value = null != lhs ? lhs[right] : void 0; + return context ? { + context: lhs, + name: right, + value: value + } : value; + } + } +} -- 2.34.1