diff --git a/lib/6to5/traverse/index.js b/lib/6to5/traverse/index.js index 2d411d1a5a..a6fe9c1efe 100644 --- a/lib/6to5/traverse/index.js +++ b/lib/6to5/traverse/index.js @@ -2,8 +2,10 @@ var VISITOR_KEYS = require("./visitor-keys"); var _ = require("lodash"); var traverse = module.exports = function (parent, callbacks, blacklistTypes) { + // falsy node if (!parent) return; + // array of nodes if (_.isArray(parent)) { _.each(parent, function (node) { traverse(node, callbacks, blacklistTypes); @@ -11,14 +13,15 @@ var traverse = module.exports = function (parent, callbacks, blacklistTypes) { return; } + // unknown node type to traverse var keys = VISITOR_KEYS[parent.type]; if (!keys) return; + // blacklist these node types from being traversed blacklistTypes = blacklistTypes || []; - if (_.isFunction(callbacks)) { - callbacks = { enter: callbacks }; - } + // normalise callbacks + if (_.isFunction(callbacks)) callbacks = { enter: callbacks }; _.each(keys, function (key) { var nodes = parent[key]; @@ -87,11 +90,15 @@ traverse.hasType = function (tree, type, blacklistTypes) { var has = false; if (_.isArray(tree)) { + // array of nodes, find the first return !!_.find(tree, function (node) { return traverse.hasType(node, type, blacklistTypes); }); } else { + // the node we're searching in is blacklisted if (_.contains(blacklistTypes, tree.type)) return false; + + // the type we're looking for is the same as the passed node if (tree.type === type) return true; traverse(tree, function (node) {