Compress [...].join() also when it cannot be completely evaluated

This commit is contained in:
Dan Wolff 2013-09-21 23:18:35 +02:00
parent 2b59abfd5a
commit 1588538bc1
2 changed files with 36 additions and 9 deletions

View File

@ -750,10 +750,33 @@ merge(Compressor.prototype, {
if (this.expression instanceof AST_Dot if (this.expression instanceof AST_Dot
&& this.expression.expression instanceof AST_Array && this.expression.expression instanceof AST_Array
&& this.expression.property == "join") { && this.expression.property == "join") {
var x = this.expression.expression.elements.map(function(el){
return ev(el, compressor); var join_arg = this.args[0] ? "" + ev(this.args[0], compressor) : ",";
}); try {
return x.join(ev(this.args[0], compressor)); var x = this.expression.expression.elements.map(function(el){
return ev(el, compressor);
});
return x.join(join_arg);
} catch (ex) {
if (ex !== def) throw ex;
join_arg = make_node_from_constant(compressor, join_arg, this.args[0]);
var x = this.expression.expression.elements.reduce(function(el1, el2){
return make_node(AST_Binary, null, {
operator : "+",
left : make_node(AST_Binary, null, {
operator : "+",
left : el1,
right : join_arg,
start : el1.start,
end : join_arg.end
}),
right : el2,
start : el1.start,
end : el2.end
});
});
return x.transform(compressor);
}
} }
} }
throw def; throw def;

View File

@ -19,17 +19,21 @@ constant_join: {
evaluate : true evaluate : true
}; };
input: { input: {
var a = [ "foo", "bar", "baz" ].join(""); var a = [ "foo", "bar", "baz" ].join();
var b = [ "foo", 1, 2, 3, "bar" ].join(""); var b = [ "foo", 1, 2, 3, "bar" ].join("");
var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join(""); var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join("");
var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-"); var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-");
var e = [].join(foo + bar); var e = [ boo ].join(foo + bar);
var f = [ boo ].join("");
var g = [ "foo", "boo" + bar, "baz"].join("-");
} }
expect: { expect: {
var a = "foobarbaz"; var a = "foo,bar,baz";
var b = "foo123bar"; var b = "foo123bar";
var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join(""); // we could still shorten this one, but oh well. var c = boo() + "foo123bar" + bar();
var d = "foo-3bar-baz"; var d = "foo-3bar-baz";
var e = [].join(foo + bar); var e = [ boo ].join(foo + bar);
var f = [ boo ].join();
var g = "foo-" + ("boo" + bar) + "-baz"; // we could still shorten this one, but oh well.
} }
} }