diff --git a/packages/babel-core/test/fixtures/plugins/multiple-definition-evaluation/exec.js b/packages/babel-core/test/fixtures/plugins/multiple-definition-evaluation/exec.js new file mode 100644 index 0000000000..de27da3c0b --- /dev/null +++ b/packages/babel-core/test/fixtures/plugins/multiple-definition-evaluation/exec.js @@ -0,0 +1,18 @@ +var code = multiline([ + "function foo() {", + " var a = a ? a : a;", + "}", +]); + +transform(code, { + plugins: function (b) { + var t = b.types; + return { + visitor: { + ConditionalExpression: function(path) { + path.get("test").evaluateTruthy(); + } + } + } + } +}); diff --git a/packages/babel-traverse/src/path/introspection.js b/packages/babel-traverse/src/path/introspection.js index 8760cfc5dd..8b70dd1d54 100644 --- a/packages/babel-traverse/src/path/introspection.js +++ b/packages/babel-traverse/src/path/introspection.js @@ -360,7 +360,10 @@ export function _resolve(dangerous?, resolved?): ?NodePath { if (binding.kind === "module") return; if (binding.path !== this) { - return binding.path.resolve(dangerous, resolved); + let ret = binding.path.resolve(dangerous, resolved); + // If the identifier resolves to parent node then we can't really resolve it. + if (this.find(parent => parent.node === ret.node)) return; + return ret; } } else if (this.isTypeCastExpression()) { return this.get("expression").resolve(dangerous, resolved);