move transformers over to using ast-types when constructing new nodes
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
var traverse = require("../traverse");
|
||||
var util = require("../util");
|
||||
var b = require("ast-types").builders;
|
||||
var _ = require("lodash");
|
||||
|
||||
exports.ClassDeclaration = function (node) {
|
||||
@@ -47,7 +48,7 @@ var buildClassBody = function (body, className, superName, node) {
|
||||
if (node.kind === "") {
|
||||
addConstructor(body[0], method);
|
||||
} else {
|
||||
throw new Error("unknown kind for constructor method");
|
||||
throw util.errorWithNode(node, "unknown kind for constructor method");
|
||||
}
|
||||
} else {
|
||||
if (node.kind === "") {
|
||||
@@ -69,29 +70,27 @@ var buildClassBody = function (body, className, superName, node) {
|
||||
|
||||
var superIdentifier = function (superName, node, parent) {
|
||||
if (parent.property === node) return;
|
||||
if (!superName) return;
|
||||
|
||||
node.name = superName.name;
|
||||
node.name = superName.name || superName.value;
|
||||
|
||||
// super(); -> ClassName.call(this);
|
||||
if (parent.type === "CallExpression" && parent.callee === node) {
|
||||
node.name += ".call";
|
||||
parent.arguments.unshift({
|
||||
type: "ThisExpression"
|
||||
});
|
||||
parent.arguments.unshift(b.thisExpression());
|
||||
}
|
||||
};
|
||||
|
||||
var replaceInstanceSuperReferences = function (superName, method) {
|
||||
superName = superName || b.literal("Function");
|
||||
|
||||
traverse(method, function (node, parent) {
|
||||
if (node.type === "Identifier" && node.name === "super") {
|
||||
superIdentifier(superName, node, parent);
|
||||
} else if (node.type === "MemberExpression") {
|
||||
// no accessing of super properties
|
||||
|
||||
|
||||
if (isAccessingSuperProperties(parent, node)) {
|
||||
throw new Error("cannot access super properties");
|
||||
throw util.errorWithNode(node, "cannot access super properties");
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
@@ -101,16 +100,10 @@ var replaceInstanceSuperReferences = function (superName, method) {
|
||||
if (callee.object.name !== "super") return;
|
||||
|
||||
callee.property.name = "prototype." + callee.property.name + ".call";
|
||||
node.arguments.unshift({
|
||||
type: "ThisExpression"
|
||||
});
|
||||
node.arguments.unshift(b.thisExpression());
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!superName) {
|
||||
throw new Error("cannot access super as this class has none");
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user