fix computed accessors on objects

This commit is contained in:
Sebastian McKenzie
2015-01-08 23:11:58 +11:00
parent 3e63e6cd4b
commit e1c7584280
8 changed files with 49 additions and 13 deletions

View File

@@ -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"),

View File

@@ -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);
}
};

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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";

View File

@@ -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";

View File

@@ -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
}));