aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-03-02 11:31:39 +0800
committerGitHub <noreply@github.com>2017-03-02 11:31:39 +0800
commitfdc9b9413bfddc711fe6195bd4fd408ab1dfa95e (patch)
tree867fc780891c6e248a3510d9e34ac77b9914949d
parent40ceddb48a6ea8d6864667574fa9db37ccc9a6bf (diff)
downloadtracifyjs-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.js29
-rw-r--r--test/compress/concat-strings.js50
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"
+ );
+ }
+}