From 082802e7a87ed37f9bb329fd963f8193218ef703 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Tue, 21 Nov 2017 13:17:32 -0800 Subject: [PATCH] JS:Treat type-annotated uninitialised vars as declarations Currently only applies to property accesses, but maybe should apply to everything. --- src/compiler/binder.ts | 5 ++++- src/compiler/utilities.ts | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index c9faefed23..dca168b4c0 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2006,6 +2006,9 @@ namespace ts { if (currentFlow && isNarrowableReference(node)) { node.flowNode = currentFlow; } + if (isSpecialPropertyDeclaration(node as PropertyAccessExpression)) { + bindThisPropertyAssignment(node as PropertyAccessExpression); + } break; case SyntaxKind.BinaryExpression: const specialKind = getSpecialPropertyAssignmentKind(node as BinaryExpression); @@ -2314,7 +2317,7 @@ namespace ts { declareSymbol(file.symbol.exports, file.symbol, node, SymbolFlags.Property | SymbolFlags.ExportValue | SymbolFlags.ValueModule, SymbolFlags.None); } - function bindThisPropertyAssignment(node: BinaryExpression) { + function bindThisPropertyAssignment(node: BinaryExpression | PropertyAccessExpression) { Debug.assert(isInJavaScriptFile(node)); const container = getThisContainer(node, /*includeArrowFunctions*/ false); switch (container.kind) { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index ac096174ab..f308403541 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1508,6 +1508,12 @@ namespace ts { return SpecialPropertyAssignmentKind.None; } + export function isSpecialPropertyDeclaration(expr: ts.PropertyAccessExpression): boolean { + return isInJavaScriptFile(expr) && + expr.parent && expr.parent.kind === SyntaxKind.ExpressionStatement && + !!getJSDocTypeTag(expr.parent); + } + export function getExternalModuleName(node: Node): Expression { if (node.kind === SyntaxKind.ImportDeclaration) { return (node).moduleSpecifier;