fix class computed methods
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user