move transformers over to using ast-types when constructing new nodes

This commit is contained in:
Sebastian McKenzie
2014-10-01 11:01:49 +10:00
parent 91737fc84b
commit 05c037d2d4
12 changed files with 95 additions and 138 deletions

View File

@@ -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");
}
});
};