diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-03-02 11:31:39 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-02 11:31:39 +0800 |
commit | fdc9b9413bfddc711fe6195bd4fd408ab1dfa95e (patch) | |
tree | 867fc780891c6e248a3510d9e34ac77b9914949d | |
parent | 40ceddb48a6ea8d6864667574fa9db37ccc9a6bf (diff) | |
download | tracifyjs-fdc9b9413bfddc711fe6195bd4fd408ab1dfa95e.tar.gz tracifyjs-fdc9b9413bfddc711fe6195bd4fd408ab1dfa95e.zip |
minor improvement to string optimisation (#1514)
- "" + "a" => "a"
- "" + a + "b" => a + "b"
- "a" + "" => "a" (improving on #45)
-rw-r--r-- | lib/compress.js | 29 | ||||
-rw-r--r-- | test/compress/concat-strings.js | 50 |
2 files changed, 69 insertions, 10 deletions
diff --git a/lib/compress.js b/lib/compress.js index 24550973..1d4e719a 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1054,12 +1054,6 @@ merge(Compressor.prototype, { def(AST_Conditional, function(compressor){ return this.consequent.is_string(compressor) && this.alternative.is_string(compressor); }); - def(AST_Call, function(compressor){ - return compressor.option("unsafe") - && this.expression instanceof AST_SymbolRef - && this.expression.name == "String" - && this.expression.undeclared(); - }); })(function(node, func){ node.DEFMETHOD("is_string", func); }); @@ -2985,10 +2979,25 @@ merge(Compressor.prototype, { } } } - if (self.operator == "+" && self.right instanceof AST_String - && self.right.getValue() === "" && self.left instanceof AST_Binary - && self.left.operator == "+" && self.left.is_string(compressor)) { - return self.left; + if (self.operator == "+") { + if (self.right instanceof AST_String + && self.right.getValue() == "" + && self.left.is_string(compressor)) { + return self.left; + } + if (self.left instanceof AST_String + && self.left.getValue() == "" + && self.right.is_string(compressor)) { + return self.right; + } + if (self.left instanceof AST_Binary + && self.left.operator == "+" + && self.left.left instanceof AST_String + && self.left.left.getValue() == "" + && self.right.is_string(compressor)) { + self.left = self.left.right; + return self.transform(compressor); + } } if (compressor.option("evaluate")) { switch (self.operator) { diff --git a/test/compress/concat-strings.js b/test/compress/concat-strings.js index d2503c6d..2f99375c 100644 --- a/test/compress/concat-strings.js +++ b/test/compress/concat-strings.js @@ -164,3 +164,53 @@ concat_6: { ); } } + +concat_7: { + input: { + console.log( + "" + 1, + "" + "1", + "" + 1 + 2, + "" + 1 + "2", + "" + "1" + 2, + "" + "1" + "2", + "" + (x += "foo") + ); + } + expect: { + console.log( + "" + 1, + "1", + "" + 1 + 2, + 1 + "2", + "1" + 2, + "1" + "2", + x += "foo" + ); + } +} + +concat_8: { + input: { + console.log( + 1 + "", + "1" + "", + 1 + 2 + "", + 1 + "2" + "", + "1" + 2 + "", + "1" + "2" + "", + (x += "foo") + "" + ); + } + expect: { + console.log( + 1 + "", + "1", + 1 + 2 + "", + 1 + "2", + "1" + 2, + "1" + "2", + x += "foo" + ); + } +} |