diff --git a/lib/compress.js b/lib/compress.js index 35646cf1..f6c7f833 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -655,6 +655,8 @@ merge(Compressor.prototype, { throw def; }); function ev(node, compressor) { + if (!compressor) throw new Error("Compressor must be passed"); + return node._eval(compressor); }; def(AST_Node, function(){ @@ -700,9 +702,6 @@ merge(Compressor.prototype, { case "+" : // handle concatenating strings even if the left part cannot // be evaluated, e.g. (variable + "str") + "str" - if (!(c instanceof Compressor)) { - throw new Error("Compressor must be passed!!"); - } if (left instanceof AST_Binary && left.operator == "+" && left.is_string(c)) { return make_node(AST_Binary, this, { operator: "+", @@ -751,10 +750,33 @@ merge(Compressor.prototype, { if (this.expression instanceof AST_Dot && this.expression.expression instanceof AST_Array && this.expression.property == "join") { - var x = this.expression.expression.elements.map(function(el){ - return ev(el, compressor); - }); - return x.join(ev(this.args[0])); + + var join_arg = this.args[0] ? "" + ev(this.args[0], compressor) : ","; + try { + 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; diff --git a/test/compress/arrays.js b/test/compress/arrays.js index 214928dd..f0f8eb17 100644 --- a/test/compress/arrays.js +++ b/test/compress/arrays.js @@ -19,15 +19,21 @@ constant_join: { evaluate : true }; input: { - var a = [ "foo", "bar", "baz" ].join(""); + var a = [ "foo", "bar", "baz" ].join(); var b = [ "foo", 1, 2, 3, "bar" ].join(""); var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join(""); var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-"); + var e = [ boo ].join(foo + bar); + var f = [ boo ].join(""); + var g = [ "foo", "boo" + bar, "baz"].join("-"); } expect: { - var a = "foobarbaz"; + var a = "foo,bar,baz"; 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 e = [ boo ].join(foo + bar); + var f = [ boo ].join(); + var g = "foo-" + ("boo" + bar) + "-baz"; // we could still shorten this one, but oh well. } }