From 453502b4f29aa759ad28a32077fe5f7a948cd324 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 13 Oct 2014 14:45:15 +1100 Subject: [PATCH] add Transformer class that deals with running a transformer against a File --- lib/6to5/file.js | 48 ++----------------------------- lib/6to5/transform.js | 18 ++++++------ lib/6to5/transformer.js | 62 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 56 deletions(-) create mode 100644 lib/6to5/transformer.js diff --git a/lib/6to5/file.js b/lib/6to5/file.js index 3f3e813b5a..5ab96ea05e 100644 --- a/lib/6to5/file.js +++ b/lib/6to5/file.js @@ -1,7 +1,6 @@ module.exports = File; var transform = require("./transform"); -var traverse = require("./traverse"); var util = require("./util"); var _ = require("lodash"); @@ -50,8 +49,8 @@ File.prototype.transform = function (ast) { var self = this; var opts = this.opts; - _.each(transform.transformers, function (transformer, name) { - self.runTransformer(name, transformer); + _.each(transform.transformers, function (transformer) { + transformer.transform(self); }); var result = util.generate(ast, opts); @@ -75,46 +74,3 @@ File.prototype.generateUid = function (name) { uids[name] = i + 1; return "_" + id; }; - -File.prototype.canRunTransformer = function (name) { - var opts = this.opts; - - var blacklist = opts.blacklist; - if (blacklist.length && _.contains(blacklist, name)) return false; - - var whitelist = opts.whitelist; - if (whitelist.length && !_.contains(whitelist, name)) return false; - - return true; -}; - -File.prototype.runTransformer = function (name, transformer) { - if (!this.canRunTransformer(name)) return; - - var self = this; - - var build = function (exit) { - return function (node, parent) { - var types = [node.type].concat(traverse.aliases[node.type] || []); - - var fns = transformer.all; - - _.each(types, function (type) { - fns = transformer[type] || fns; - }); - - if (!fns) return; - - var fn = fns.enter; - if (exit) fn = fns.exit; - if (!fn) return; - - return fn(node, parent, self); - }; - }; - - traverse(this.ast, { - enter: build(), - exit: build(true) - }); -}; diff --git a/lib/6to5/transform.js b/lib/6to5/transform.js index 0ebb89f1f3..bac4f7f8ca 100644 --- a/lib/6to5/transform.js +++ b/lib/6to5/transform.js @@ -1,10 +1,11 @@ module.exports = transform; -var sourceMap = require("source-map"); -var recast = require("recast"); -var File = require("./file"); -var util = require("./util"); -var _ = require("lodash"); +var Transformer = require("./transformer"); +var sourceMap = require("source-map"); +var recast = require("recast"); +var File = require("./file"); +var util = require("./util"); +var _ = require("lodash"); function transform(code, opts) { opts = opts || {}; @@ -87,9 +88,6 @@ transform.transformers = { _aliasFunctions: require("./transformers/_alias-functions") }; -_.each(transform.transformers, function (transformer) { - _.each(transformer, function (fns, type) { - if (_.isFunction(fns)) fns = { enter: fns }; - transformer[type] = fns; - }); +_.each(transform.transformers, function (transformer, key) { + transform.transformers[key] = new Transformer(key, transformer); }); diff --git a/lib/6to5/transformer.js b/lib/6to5/transformer.js new file mode 100644 index 0000000000..3ec3652374 --- /dev/null +++ b/lib/6to5/transformer.js @@ -0,0 +1,62 @@ +module.exports = Transformer; + +var traverse = require("./traverse"); +var _ = require("lodash"); + +function Transformer(key, transformer) { + this.transformer = Transformer.normalise(transformer); + this.key = key; +} + +Transformer.normalise = function (transformer) { + _.each(transformer, function (fns, type) { + if (_.isFunction(fns)) fns = { enter: fns }; + transformer[type] = fns; + }); + return transformer; +}; + +Transformer.prototype.transform = function (file) { + if (!this.canRun(file)) return; + + var transformer = this.transformer; + + var build = function (exit) { + return function (node, parent) { + // add any node type aliases that exist + var types = [node.type].concat(traverse.aliases[node.type] || []); + + var fns = transformer.all; + + _.each(types, function (type) { + fns = transformer[type] || fns; + }); + + // this transformer cannot deal with this node type + if (!fns) return; + + var fn = fns.enter; + if (exit) fn = fns.exit; + if (!fn) return; + + return fn(node, parent, file); + }; + }; + + traverse(file.ast, { + enter: build(), + exit: build(true) + }); +}; + +Transformer.prototype.canRun = function (file) { + var opts = file.opts; + + var blacklist = opts.blacklist; + if (blacklist.length && _.contains(blacklist, this.key)) return false; + + var whitelist = opts.whitelist; + if (whitelist.length && !_.contains(whitelist, this.key)) return false; + + return true; +};