From a6b374a681cbb39a7499326879fd35d095f29cfe Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 8 Jun 2015 14:52:13 +0100 Subject: [PATCH] save union type in _getTypeAnnotationBindingConstantViolations to prevent infinite recursion --- src/babel/traversal/path/resolution.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/babel/traversal/path/resolution.js b/src/babel/traversal/path/resolution.js index 80fa332d02..5b3c974495 100644 --- a/src/babel/traversal/path/resolution.js +++ b/src/babel/traversal/path/resolution.js @@ -89,6 +89,9 @@ export function getTypeAnnotation(force) { export function _getTypeAnnotationBindingConstantViolations(name, types = []) { var binding = this.scope.getBinding(name); + var types = []; + this.typeAnnotation = t.unionTypeAnnotation(types); + for (var constantViolation of (binding.constantViolations: Array)) { types.push(constantViolation.getTypeAnnotation()); } @@ -132,9 +135,15 @@ export function _getTypeAnnotation(force?: boolean): ?Object { var id = this.get("id"); if (id.isIdentifier()) { - return this._getTypeAnnotationBindingConstantViolations(id.node.name, [ - this.get("init").getTypeAnnotation() - ]); + var init = this.get("init").getTypeAnnotation(); + + // just because we're inferring a VariableDeclarator doesn't mean that it's the same + // binding path as it may have been shadowed + if (this.scope.getBinding(id.node.name).path === this) { + return this._getTypeAnnotationBindingConstantViolations(id.node.name, [init]); + } else { + return init; + } } else { return; }