diff --git a/lib/6to5/transformers/block-binding.js b/lib/6to5/transformers/block-binding.js index cf44b6e019..f829d62a33 100644 --- a/lib/6to5/transformers/block-binding.js +++ b/lib/6to5/transformers/block-binding.js @@ -24,7 +24,7 @@ var hasLet = function (nodes) { }; exports.Program = function (node) { - if (hasLet(node.body)) node.body = buildNode(node.body).node; + if (hasLet(node.body)) node.body = buildNode(node.body).node; }; exports.BlockStatement = function (node, parent, opts, generateUid) { @@ -38,7 +38,7 @@ exports.BlockStatement = function (node, parent, opts, generateUid) { var built = buildNode(node.body, true); node.body = built.node; - traverse.replace(built.body, function (node) { + traverse(built.body, function (node) { if (node.type === "ContinueStatement") { return b.returnStatement(null); } @@ -51,7 +51,7 @@ exports.BlockStatement = function (node, parent, opts, generateUid) { b.variableDeclarator(id, b.literal(false)) ])); - traverse.replace(built.body, function (node) { + traverse(built.body, function (node) { if (node.type === "BreakStatement") { return b.returnStatement(b.assignmentExpression("=", id, b.literal(true))); } diff --git a/lib/6to5/traverse/index.js b/lib/6to5/traverse/index.js index 89778910b8..0fd057cad8 100644 --- a/lib/6to5/traverse/index.js +++ b/lib/6to5/traverse/index.js @@ -1,12 +1,12 @@ var VISITOR_KEYS = require("./visitor-keys"); var _ = require("lodash"); -var traverse = module.exports = function (parent, callback, blacklistTypes) { +var traverse = module.exports = function (parent, callbacks, blacklistTypes) { if (!parent) return; if (_.isArray(parent)) { _.each(parent, function (node) { - traverse(node, callback, blacklistTypes); + traverse(node, callbacks, blacklistTypes); }); return; } @@ -14,6 +14,10 @@ var traverse = module.exports = function (parent, callback, blacklistTypes) { var keys = VISITOR_KEYS[parent.type] || []; blacklistTypes = blacklistTypes || []; + if (_.isFunction(callbacks)) { + callbacks = { enter: callbacks }; + } + _.each(keys, function (key) { var nodes = parent[key]; if (!nodes) return; @@ -21,14 +25,23 @@ var traverse = module.exports = function (parent, callback, blacklistTypes) { var handle = function (obj, key) { var node = obj[key]; if (!node) return; + + // type is blacklisted if (blacklistTypes.indexOf(node.type) >= 0) return; - // strict references in case the callback modified/replaced the node + // enter + var result = callbacks.enter(node, parent, obj, key); - var result = callback(obj[key], parent, obj, key); + // stop iteration if (result === false) return; - traverse(obj[key], callback, blacklistTypes); + // replace node + if (result != null) node = obj[key] = result; + + traverse(node, callbacks, blacklistTypes); + + // exit + if (callbacks.exit) callbacks.exit(node, parent, obj, key); }; if (_.isArray(nodes)) { @@ -36,6 +49,7 @@ var traverse = module.exports = function (parent, callback, blacklistTypes) { handle(nodes, i); }); + // remove deleted nodes parent[key] = _.flatten(parent[key]).filter(function (node) { return node !== traverse.Delete; }); @@ -73,11 +87,3 @@ traverse.hasType = function (tree, type, blacklistTypes) { return has; }; - -traverse.replace = function (node, callback, blacklistTypes) { - traverse(node, function (node, parent, obj, key) { - var result = callback(node, parent); - if (result === false) return false; - if (result != null) obj[key] = result; - }, blacklistTypes); -}; diff --git a/lib/6to5/util.js b/lib/6to5/util.js index 8d5c1f33f7..5a2bab5d55 100644 --- a/lib/6to5/util.js +++ b/lib/6to5/util.js @@ -112,7 +112,7 @@ exports.template = function (name, nodes, keepExpression) { template = _.cloneDeep(template); if (!_.isEmpty(nodes)) { - traverse.replace(template, function (node) { + traverse(template, function (node) { if (node.type === "Identifier" && _.has(nodes, node.name)) { var newNode = nodes[node.name]; if (_.isString(newNode)) {