diff --git a/lib/compress.js b/lib/compress.js index 3d6945d0..e477a2d6 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4828,7 +4828,7 @@ merge(Compressor.prototype, { } if (is_lhs(self, compressor.parent())) return self; if (compressor.option("properties") && key !== prop) { - var node = self.flatten_object(property); + var node = self.flatten_object(property, compressor); if (node) { expr = self.expression = node.expression; prop = self.property = node.property; @@ -4888,22 +4888,26 @@ merge(Compressor.prototype, { return result; }); - AST_PropAccess.DEFMETHOD("flatten_object", function(key) { + AST_PropAccess.DEFMETHOD("flatten_object", function(key, compressor) { + var arrows = compressor.option("unsafe_arrows") && compressor.option("ecma") >= 6; var expr = this.expression; if (expr instanceof AST_Object) { var props = expr.properties; for (var i = props.length; --i >= 0;) { var prop = props[i]; - if ("" + prop.key == key) { + if ("" + (prop instanceof AST_ConciseMethod ? prop.key.name : prop.key) == key) { if (!all(props, function(prop) { - return prop instanceof AST_ObjectKeyVal; + return prop instanceof AST_ObjectKeyVal + || arrows && prop instanceof AST_ConciseMethod && !prop.is_generator; })) break; var value = prop.value; - if (value instanceof AST_Function && value.contains_this()) break; + if ((value instanceof AST_Accessor || value instanceof AST_Function) + && value.contains_this()) break; return make_node(AST_Sub, this, { expression: make_node(AST_Array, expr, { elements: props.map(function(prop) { - return prop.value; + var v = prop.value; + return v instanceof AST_Accessor ? make_node(AST_Function, v, v) : v; }) }), property: make_node(AST_Number, this, { @@ -4944,7 +4948,7 @@ merge(Compressor.prototype, { } if (is_lhs(self, compressor.parent())) return self; if (compressor.option("properties")) { - var node = self.flatten_object(self.property); + var node = self.flatten_object(self.property, compressor); if (node) return node.optimize(compressor); } var ev = self.evaluate(compressor); diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index f849d69d..0a88220d 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -1291,7 +1291,6 @@ issue_2063: { } expect: { var a; - var a; } } diff --git a/test/compress/harmony.js b/test/compress/harmony.js index 60bc5793..f2e68b17 100644 --- a/test/compress/harmony.js +++ b/test/compress/harmony.js @@ -902,10 +902,10 @@ issue_2349b: { evaluate: true, inline: true, passes: 3, + properties: true, reduce_vars: true, toplevel: true, side_effects: true, - unsafe: true, unsafe_arrows: true, unused: true, } diff --git a/test/compress/properties.js b/test/compress/properties.js index 3a94c82c..f9b2e294 100644 --- a/test/compress/properties.js +++ b/test/compress/properties.js @@ -797,8 +797,8 @@ issue_2208_5: { issue_2208_6: { options = { inline: true, + properties: true, side_effects: true, - unsafe: true, } input: { console.log({ @@ -814,9 +814,11 @@ issue_2208_6: { issue_2208_7: { options = { + ecma: 6, inline: true, + properties: true, side_effects: true, - unsafe: true, + unsafe_arrows: true, } input: { console.log({ @@ -834,9 +836,11 @@ issue_2208_7: { issue_2208_8: { options = { + ecma: 6, inline: true, + properties: true, side_effects: true, - unsafe: true, + unsafe_arrows: true, } input: { console.log({ @@ -856,17 +860,17 @@ issue_2208_8: { return x(); } }.p()); - console.log(async function() { + console.log((async () => { return await x(); - }()); + })()); } } issue_2208_9: { options = { inline: true, + properties: true, side_effects: true, - unsafe: true, } input: { a = 42; diff --git a/test/compress/template-string.js b/test/compress/template-string.js index 5e6e01f8..a84c1042 100644 --- a/test/compress/template-string.js +++ b/test/compress/template-string.js @@ -442,7 +442,7 @@ simple_string: { console.log({[`foo`]: 1}[`foo`], `hi` == "hi", `world`); } expect: { - console.log({foo: 1}.foo, true, "world"); + console.log([ 1 ][0], true, "world"); } expect_stdout: "1 true 'world'" node_version: ">=4"