more reliable super parsing in classes - fixes #51

This commit is contained in:
Sebastian McKenzie
2014-10-12 09:39:29 +11:00
parent 7e48d48a72
commit 5edbb63f9a

View File

@@ -127,16 +127,16 @@ var buildClassBody = function (body, className, superName, node) {
var superIdentifier = function (superName, methodNode, methodName, node, parent) {
if (parent.property === node) return;
node.name = superName.name || superName.value;
// super(); -> ClassName.prototype.MethodName.call(this);
if (parent.type === "CallExpression" && parent.callee === node) {
parent.arguments.unshift(b.thisExpression());
if (methodName === "constructor") {
// constructor() { super(); }
return b.memberExpression(node, b.identifier("call"), false);
return b.memberExpression(superName, b.identifier("call"), false);
} else {
node = superName;
// foo() { super(); }
if (!methodNode.static) {
node = b.memberExpression(node, b.identifier("prototype"), false);
@@ -147,12 +147,14 @@ var superIdentifier = function (superName, methodNode, methodName, node, parent)
}
} else if (parent.type === "MemberExpression") {
// super.test -> ClassName.prototype.test
return b.memberExpression(node, b.identifier("prototype"), false);
return b.memberExpression(superName, b.identifier("prototype"), false);
} else {
return superName;
}
};
var replaceInstanceSuperReferences = function (superName, method, methodNode, methodName) {
superName = superName || b.literal("Function");
superName = superName || b.identifier("Function");
traverse(method, function (node, parent) {
if (node.type === "Identifier" && node.name === "super") {
@@ -162,7 +164,7 @@ var replaceInstanceSuperReferences = function (superName, method, methodNode, me
if (callee.type !== "MemberExpression") return;
if (callee.object.name !== "super") return;
// super.test(); -> Classname.prototype.MethodName.call(this);
// super.test(); -> ClassName.prototype.MethodName.call(this);
callee.property.name = callee.property.name + ".call";
node.arguments.unshift(b.thisExpression());
}