fix blacklist traversal bug - fixes #49

This commit is contained in:
Sebastian McKenzie
2014-10-12 09:34:01 +11:00
parent 09250a5f39
commit 27cb0f6f87
4 changed files with 21 additions and 4 deletions

View File

@@ -13,7 +13,7 @@ exports.ObjectExpression = function (node, parent, opts, generateUid) {
if (prop.computed) {
hasComputed = true;
computed.unshift(prop);
if (!hasThis) hasThis = traverse.hasType(prop, "ThisExpression");
hasThis = hasThis || traverse.hasType(prop, "ThisExpression");
return false;
} else {
return true;

View File

@@ -29,7 +29,7 @@ var traverse = module.exports = function (parent, callbacks, blacklistTypes) {
if (!node) return;
// type is blacklisted
if (blacklistTypes.indexOf(node.type) >= 0) return;
if (_.contains(blacklistTypes, node.type)) return;
// enter
var result = callbacks.enter(node, parent, obj, key);
@@ -40,6 +40,7 @@ var traverse = module.exports = function (parent, callbacks, blacklistTypes) {
// replace node
if (result != null) node = obj[key] = result;
// traverse node
traverse(node, callbacks, blacklistTypes);
// exit
@@ -71,16 +72,18 @@ traverse.FUNCTION_TYPES = ["ArrowFunctionExpression", "FunctionDeclaration", "Fu
traverse.Delete = {};
traverse.hasType = function (tree, type, blacklistTypes) {
if (tree.type === type) return true;
blacklistTypes = [].concat(blacklistTypes || []);
var has = false;
blacklistTypes = blacklistTypes || [];
if (_.isArray(tree)) {
return !!_.find(tree, function (node) {
return traverse.hasType(node, type, blacklistTypes);
});
} else {
if (_.contains(blacklistTypes, tree.type)) return false;
if (tree.type === type) return true;
traverse(tree, function (node) {
if (node.type === type) {
has = true;