more reliable super parsing in classes - fixes #51
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user