fix spread and super resolution - fixes #42
This commit is contained in:
@@ -133,19 +133,23 @@ var superIdentifier = function (superName, methodNode, methodName, node, parent)
|
||||
|
||||
// super(); -> ClassName.prototype.MethodName.call(this);
|
||||
if (parent.type === "CallExpression" && parent.callee === node) {
|
||||
parent.arguments.unshift(b.thisExpression());
|
||||
|
||||
if (methodName === "constructor") {
|
||||
// constructor() { super(); }
|
||||
node.name += ".call";
|
||||
return b.memberExpression(node, b.identifier("call"), false);
|
||||
} else {
|
||||
// foo() { super(); }
|
||||
if (!methodNode.static) node.name += ".prototype";
|
||||
node.name += "." + methodName + ".call";
|
||||
}
|
||||
if (!methodNode.static) {
|
||||
node = b.memberExpression(node, b.identifier("prototype"), false);
|
||||
}
|
||||
|
||||
parent.arguments.unshift(b.thisExpression());
|
||||
node = b.memberExpression(node, b.identifier(methodName), false);
|
||||
return b.memberExpression(node, b.identifier("call"), false);
|
||||
}
|
||||
} else if (parent.type === "MemberExpression") {
|
||||
// super.test -> ClassName.prototype.test
|
||||
node.name += ".prototype";
|
||||
return b.memberExpression(node, b.identifier("prototype"), false);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -154,7 +158,7 @@ var replaceInstanceSuperReferences = function (superName, method, methodNode, me
|
||||
|
||||
traverse(method, function (node, parent) {
|
||||
if (node.type === "Identifier" && node.name === "super") {
|
||||
superIdentifier(superName, methodNode, methodName, node, parent);
|
||||
return superIdentifier(superName, methodNode, methodName, node, parent);
|
||||
} else if (node.type === "CallExpression") {
|
||||
var callee = node.callee;
|
||||
if (callee.type !== "MemberExpression") return;
|
||||
|
||||
@@ -3,8 +3,6 @@ var b = require("ast-types").builders;
|
||||
var _ = require("lodash");
|
||||
|
||||
exports.ArrayExpression = function (node) {
|
||||
//if (node.ignoreSpread) return;
|
||||
|
||||
var elements = node.elements;
|
||||
if (!elements.length) return;
|
||||
|
||||
@@ -51,9 +49,9 @@ exports.CallExpression = function (node) {
|
||||
|
||||
if (callee.type === "MemberExpression") {
|
||||
contextLiteral = callee.object;
|
||||
callee.property.name += ".apply";
|
||||
callee.property = b.memberExpression(callee.property, b.identifier("apply"), false);
|
||||
} else {
|
||||
node.callee.name += ".apply";
|
||||
node.callee = b.memberExpression(node.callee, b.identifier("apply"), false);
|
||||
}
|
||||
|
||||
node.arguments.unshift(contextLiteral);
|
||||
|
||||
Reference in New Issue
Block a user