From e1c7584280a61034dd0f1cca400decd057a89730 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 8 Jan 2015 23:11:58 +1100 Subject: [PATCH] fix computed accessors on objects --- lib/6to5/transformation/transform.js | 3 +-- .../transformers/es6-classes.js | 2 +- .../es6-computed-property-names.js | 6 +++-- .../es6-property-method-assignment.js | 2 +- lib/6to5/util.js | 6 ++--- .../computed/actual.js | 8 +++++++ .../computed/expected.js | 24 +++++++++++++++++++ .../object-getter-memoization/expected.js | 11 +++++---- 8 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 test/fixtures/transformation/es6-property-method-assignment/computed/actual.js create mode 100644 test/fixtures/transformation/es6-property-method-assignment/computed/expected.js diff --git a/lib/6to5/transformation/transform.js b/lib/6to5/transformation/transform.js index 5b6104e1b7..6c118e03a9 100644 --- a/lib/6to5/transformation/transform.js +++ b/lib/6to5/transformation/transform.js @@ -60,13 +60,12 @@ _.each({ arrowFunctions: require("./transformers/es6-arrow-functions"), classes: require("./transformers/es6-classes"), - computedPropertyNames: require("./transformers/es6-computed-property-names"), - objectSpread: require("./transformers/es7-object-spread"), exponentiationOperator: require("./transformers/es7-exponentiation-operator"), spread: require("./transformers/es6-spread"), templateLiterals: require("./transformers/es6-template-literals"), propertyMethodAssignment: require("./transformers/es6-property-method-assignment"), + computedPropertyNames: require("./transformers/es6-computed-property-names"), destructuring: require("./transformers/es6-destructuring"), defaultParameters: require("./transformers/es6-default-parameters"), forOf: require("./transformers/es6-for-of"), diff --git a/lib/6to5/transformation/transformers/es6-classes.js b/lib/6to5/transformation/transformers/es6-classes.js index f0922ebb8b..8444212260 100644 --- a/lib/6to5/transformation/transformers/es6-classes.js +++ b/lib/6to5/transformation/transformers/es6-classes.js @@ -210,7 +210,7 @@ Class.prototype.pushMethod = function (node) { } else { this.hasInstanceMutators = true; } - util.pushMutatorMap(mutatorMap, methodName, kind, node); + util.pushMutatorMap(mutatorMap, methodName, kind, node.computed, node); } }; diff --git a/lib/6to5/transformation/transformers/es6-computed-property-names.js b/lib/6to5/transformation/transformers/es6-computed-property-names.js index 76081ceb64..3a559177df 100644 --- a/lib/6to5/transformation/transformers/es6-computed-property-names.js +++ b/lib/6to5/transformation/transformers/es6-computed-property-names.js @@ -7,7 +7,7 @@ exports.ObjectExpression = function (node, parent, file, scope) { var i; for (i in node.properties) { - hasComputed = t.isProperty(node.properties[i], { computed: true }); + hasComputed = t.isProperty(node.properties[i], { computed: true, kind: "init" }); if (hasComputed) break; } @@ -25,6 +25,8 @@ exports.ObjectExpression = function (node, parent, file, scope) { for (i in props) { prop = props[i]; + if (prop.kind !== "init") continue; + key = prop.key; if (!prop.computed && t.isIdentifier(key)) { @@ -44,7 +46,7 @@ exports.ObjectExpression = function (node, parent, file, scope) { broken = true; } - if (!broken || t.isLiteral(t.toComputedKey(prop, prop.key), { value: "__proto__" })) { + if (prop.kind !== "init" || !broken || t.isLiteral(t.toComputedKey(prop, prop.key), { value: "__proto__" })) { initProps.push(prop); props[i] = null; } diff --git a/lib/6to5/transformation/transformers/es6-property-method-assignment.js b/lib/6to5/transformation/transformers/es6-property-method-assignment.js index 035b8839db..743f2b8079 100644 --- a/lib/6to5/transformation/transformers/es6-property-method-assignment.js +++ b/lib/6to5/transformation/transformers/es6-property-method-assignment.js @@ -53,7 +53,7 @@ exports.ObjectExpression = function (node, parent, file, scope) { node.properties = node.properties.filter(function (prop) { if (prop.kind === "get" || prop.kind === "set") { hasAny = true; - util.pushMutatorMap(mutatorMap, prop.key, prop.kind, prop.value); + util.pushMutatorMap(mutatorMap, prop.key, prop.kind, prop.computed, prop.value); return false; } else { return true; diff --git a/lib/6to5/util.js b/lib/6to5/util.js index 85368e6f58..c421ae6199 100644 --- a/lib/6to5/util.js +++ b/lib/6to5/util.js @@ -65,12 +65,12 @@ exports.sourceMapToComment = function (map) { return "//# sourceMappingURL=data:application/json;base64," + base64; }; -exports.pushMutatorMap = function (mutatorMap, key, kind, method) { +exports.pushMutatorMap = function (mutatorMap, key, kind, computed, method) { var alias; if (t.isIdentifier(key)) { alias = key.name; - if (method.computed) alias = "computed:" + alias; + if (computed) alias = "computed:" + alias; } else if (t.isLiteral(key)) { alias = String(key.value); } else { @@ -86,7 +86,7 @@ exports.pushMutatorMap = function (mutatorMap, key, kind, method) { mutatorMap[alias] = map; map._key = key; - if (method.computed) { + if (computed) { map._computed = true; } diff --git a/test/fixtures/transformation/es6-property-method-assignment/computed/actual.js b/test/fixtures/transformation/es6-property-method-assignment/computed/actual.js new file mode 100644 index 0000000000..bc8b2e0ffb --- /dev/null +++ b/test/fixtures/transformation/es6-property-method-assignment/computed/actual.js @@ -0,0 +1,8 @@ +var x = "y"; +var valueSet; +var obj = { + get [x] () { return 1 }, + set [x] (value) { valueSet = value } +}; +obj.y = "foo"; +obj.y === 1 && valueSet === "foo"; diff --git a/test/fixtures/transformation/es6-property-method-assignment/computed/expected.js b/test/fixtures/transformation/es6-property-method-assignment/computed/expected.js new file mode 100644 index 0000000000..5622ed391e --- /dev/null +++ b/test/fixtures/transformation/es6-property-method-assignment/computed/expected.js @@ -0,0 +1,24 @@ +"use strict"; + +var _defineProperty = function (obj, key, value) { + return Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); +}; + +var x = "y"; +var valueSet; +var obj = Object.defineProperties({}, _defineProperty({}, x, { + get: function () { + return 1; + }, + set: function (value) { + valueSet = value; + }, + enumerable: true +})); +obj.y = "foo"; +obj.y === 1 && valueSet === "foo"; diff --git a/test/fixtures/transformation/playground/object-getter-memoization/expected.js b/test/fixtures/transformation/playground/object-getter-memoization/expected.js index 49f02f0550..c94e260493 100644 --- a/test/fixtures/transformation/playground/object-getter-memoization/expected.js +++ b/test/fixtures/transformation/playground/object-getter-memoization/expected.js @@ -30,13 +30,16 @@ _prototypeProperties(Foo, null, _defineProperty({ enumerable: true })); -var foo = _defineProperty(Object.defineProperties({}, { +var foo = Object.defineProperties({}, _defineProperty({ bar: { get: function () { return _defineProperty(this, "bar", complex()).bar; }, enumerable: true } -}), bar, function () { - return _defineProperty(this, bar, complex())[bar]; -}); +}, bar, { + get: function () { + return _defineProperty(this, bar, complex())[bar]; + }, + enumerable: true +}));