fix class computed methods

This commit is contained in:
Sebastian McKenzie
2014-11-04 15:53:36 +11:00
parent d7ae3b506a
commit 5ff6f445b2
5 changed files with 31 additions and 21 deletions

View File

@@ -88,17 +88,17 @@ var buildClassBody = function (opts) {
var classBody = node.body.body;
_.each(classBody, function (node) {
var methodName = node.key.name;
var methodName = node.key;
var method = node.value;
replaceInstanceSuperReferences(superName, method, node, methodName);
replaceInstanceSuperReferences(superName, node);
if (methodName === "constructor") {
if (node.key.name === "constructor") {
if (node.kind === "") {
hasConstructor = true;
addConstructor(constructor, method);
} else {
throw file.errorWithNode(node, "unknown kind for constructor method");
throw file.errorWithNode(node, "illegal kind for constructor method");
}
} else {
var mutatorMap = instanceMutatorMap;
@@ -148,14 +148,16 @@ var buildClassBody = function (opts) {
}
};
var superIdentifier = function (superName, methodNode, methodName, node, parent) {
var superIdentifier = function (superName, methodNode, node, parent) {
var methodName = methodNode.key;
if (parent.property === node) {
return;
} else if (t.isCallExpression(parent) && parent.callee === node) {
// super(); -> ClassName.prototype.MethodName.call(this);
parent.arguments.unshift(t.thisExpression());
if (methodName === "constructor") {
if (methodName.name === "constructor") {
// constructor() { super(); }
return t.memberExpression(superName, t.identifier("call"));
} else {
@@ -166,7 +168,7 @@ var superIdentifier = function (superName, methodNode, methodName, node, parent)
node = t.memberExpression(node, t.identifier("prototype"));
}
node = t.memberExpression(node, t.identifier(methodName));
node = t.memberExpression(node, methodName, methodNode.computed);
return t.memberExpression(node, t.identifier("call"));
}
} else if (t.isMemberExpression(parent) && !methodNode.static) {
@@ -177,12 +179,15 @@ var superIdentifier = function (superName, methodNode, methodName, node, parent)
}
};
var replaceInstanceSuperReferences = function (superName, method, methodNode, methodName) {
var replaceInstanceSuperReferences = function (superName, methodNode) {
var methodName = methodNode.key;
var method = methodNode.value;
superName = superName || t.identifier("Function");
traverse(method, function (node, parent) {
if (t.isIdentifier(node) && node.name === "super") {
return superIdentifier(superName, methodNode, methodName, node, parent);
return superIdentifier(superName, methodNode, node, parent);
} else if (t.isCallExpression(node)) {
var callee = node.callee;
if (!t.isMemberExpression(callee)) return;