expose ast transformer - fixes #263

This commit is contained in:
Sebastian McKenzie
2014-12-10 21:31:27 +11:00
parent f11f364d2c
commit b986a4e482
4 changed files with 45 additions and 14 deletions

View File

@@ -156,14 +156,16 @@ File.prototype.errorWithNode = function (node, msg, Error) {
return err;
};
File.prototype.parse = function (code) {
File.prototype.addCode = function (code) {
code = (code || "") + "";
this.code = code;
return this.parseShebang(code);
};
File.prototype.parse = function (code) {
var self = this;
this.code = code;
code = this.parseShebang(code);
this.addCode(code);
return util.parse(this.opts, code, function (tree) {
self.transform(tree);

View File

@@ -2,6 +2,7 @@ module.exports = transform;
var Transformer = require("./transformer");
var File = require("../file");
var util = require("../util");
var _ = require("lodash");
function transform(code, opts) {
@@ -9,6 +10,15 @@ function transform(code, opts) {
return file.parse(code);
}
transform.fromAst = function (ast, code, opts) {
ast = util.normaliseAst(ast);
var file = new File(opts);
file.addCode(code);
file.transform();
return file.generate();
};
transform._ensureTransformerNames = function (type, keys) {
_.each(keys, function (key) {
if (!_.has(transform.transformers, key)) {
@@ -30,9 +40,9 @@ transform.moduleFormatters = {
_.each({
// spec
_blockHoistFunctions: require("./transformers/spec-block-hoist-functions"),
_noForInOfAssignment: require("./transformers/spec-no-for-in-of-assignment"),
_noDuplicateProperties: require("./transformers/spec-no-duplicate-properties"),
specBlockHoistFunctions: require("./transformers/spec-block-hoist-functions"),
specNoForInOfAssignment: require("./transformers/spec-no-for-in-of-assignment"),
specNoDuplicateProperties: require("./transformers/spec-no-duplicate-properties"),
// playground
methodBinding: require("./transformers/playground-method-binding"),
@@ -70,8 +80,8 @@ _.each({
generators: require("./transformers/es6-generators"),
// spec
_propertyLiterals: require("./transformers/spec-property-literals"),
_memberExpressioLiterals: require("./transformers/spec-member-expression-literals"),
specPropertyLiterals: require("./transformers/spec-property-literals"),
specMemberExpressioLiterals: require("./transformers/spec-member-expression-literals"),
// wrap up
_aliasFunctions: require("./transformers/_alias-functions"),

View File

@@ -212,6 +212,20 @@ exports.repeat = function (width, cha) {
return new Array(width + 1).join(cha);
};
exports.normaliseAst = function (ast, comments, tokens) {
if (ast && ast.type === "Program") {
ast = t.file(ast, comments || [], tokens || []);
traverse(ast, function (node, parent) {
node._parent = parent;
});
return ast;
} else {
throw new Error("Not a valid ast?");
}
};
exports.parse = function (opts, code, callback) {
try {
var comments = [];
@@ -231,11 +245,7 @@ exports.parse = function (opts, code, callback) {
estraverse.attachComments(ast, comments, tokens);
ast = t.file(ast, comments, tokens);
traverse(ast, function (node, parent) {
node._parent = parent;
});
ast = exports.normaliseAst(ast, comments, tokens);
if (callback) {
return callback(ast);