diff --git a/packages/babel-core/test/fixtures/plugins/inference-recursion/exec.js b/packages/babel-core/test/fixtures/plugins/inference-recursion/exec.js new file mode 100644 index 0000000000..f643ac27d0 --- /dev/null +++ b/packages/babel-core/test/fixtures/plugins/inference-recursion/exec.js @@ -0,0 +1,57 @@ +var code = (function() { + var kind; + function readObj() { + expect('{'); + if (!skip('}')) { + do { + expect('String'); + expect(':'); + readVal(); + } while (skip(',')); + expect('}'); + } + } + + function expect(str) { + if (kind === str) { + return lex(); + } + throw syntaxError('Expected ' + str + ' but got ' + string.slice(start, end) + '.'); + } + + function readArr() { + expect('['); + if (!skip(']')) { + do { + readVal(); + } while (skip(',')); + expect(']'); + } + } + + function readVal() { + switch (kind) { + case '[': + return readArr(); + case '{': + return readObj(); + case 'String': + return lex(); + default: + return expect('Value'); + } + } +}).toString().split('\n').slice(1, -1).join('\n'); + +transform(code, { + plugins: function (b) { + var t = b.types; + return { + visitor: { + BinaryExpression: function(path) { + path.get("left").baseTypeStrictlyMatches(path.get("right")); + } + } + } + } +}); diff --git a/packages/babel-traverse/src/path/introspection.js b/packages/babel-traverse/src/path/introspection.js index 8b70dd1d54..720e738e86 100644 --- a/packages/babel-traverse/src/path/introspection.js +++ b/packages/babel-traverse/src/path/introspection.js @@ -235,7 +235,9 @@ export function _guessExecutionStatusRelativeTo(target) { let targetFuncParent = target.scope.getFunctionParent(); let selfFuncParent = this.scope.getFunctionParent(); - if (targetFuncParent !== selfFuncParent) { + // here we check the `node` equality as sometimes we may have different paths for the + // same node due to path thrashing + if (targetFuncParent.node !== selfFuncParent.node) { let status = this._guessExecutionStatusRelativeToDifferentFunctions(targetFuncParent); if (status) { return status;