diff --git a/lib/6to5/traverse/index.js b/lib/6to5/traverse/index.js index 1995a5b992..86ee88f0e3 100644 --- a/lib/6to5/traverse/index.js +++ b/lib/6to5/traverse/index.js @@ -18,7 +18,7 @@ function traverse(parent, callbacks, opts) { // unknown node type to traverse var keys = t.VISITOR_KEYS[parent.type]; - if (!keys) return; + if (!keys) throw new Error("unknown node " + parent.type); opts = opts || {}; if (_.isArray(opts)) opts = { blacklist: opts }; @@ -29,25 +29,32 @@ function traverse(parent, callbacks, opts) { // normalise callbacks if (_.isFunction(callbacks)) callbacks = { enter: callbacks }; - _.each(keys, function (key) { + for (var i in keys) { + var key = keys[i]; var nodes = parent[key]; - if (!nodes) return; + if (!nodes) continue; + + var updated = false; var handle = function (obj, key) { var node = obj[key]; if (!node) return; // type is blacklisted - if (_.contains(blacklistTypes, node.type)) return; + if (blacklistTypes.indexOf(node.type) > -1) return; // replace node var maybeReplace = function (result) { if (result === false) return; - if (result != null) node = obj[key] = result; + + if (result != null) { + updated = true; + node = obj[key] = result; + } }; // - var opts2 = _.clone(opts); + var opts2 = { scope: opts.scope, blacklist: opts.blacklist }; if (t.isScope(node)) opts2.scope = new Scope(opts.scope, node); // enter @@ -69,15 +76,15 @@ function traverse(parent, callbacks, opts) { }; if (_.isArray(nodes)) { - _.each(nodes, function (node, i) { + for (var i in nodes) { handle(nodes, i); - }); + } - parent[key] = _.flatten(parent[key]); + if (updated) parent[key] = _.flatten(parent[key]); } else { handle(parent, key); } - }); + } } traverse.removeProperties = function (tree) {