From 4d436828dda5a7b2fcebf6d1c6331e2972fb530a Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Thu, 5 Apr 2018 09:37:26 -0700 Subject: [PATCH 1/2] Fix crash in type resolution in JS IIFEs We recognise IIFEs as JS special assignment initialisers, but not as containers otherwise. That means that IIFEs will not have a symbol unless they have an *outside* assignment. The permanent fix will be to make IIFEs a container, based on the containership of the value that they return. This fix does not do that; it just makes type resolution return undefined instead of crashing. --- src/compiler/checker.ts | 3 +++ tests/baselines/reference/typeLookupInIIFE.symbols | 9 +++++++++ tests/baselines/reference/typeLookupInIIFE.types | 12 ++++++++++++ tests/cases/conformance/salsa/typeLookupInIIFE.ts | 9 +++++++++ 4 files changed, 33 insertions(+) create mode 100644 tests/baselines/reference/typeLookupInIIFE.symbols create mode 100644 tests/baselines/reference/typeLookupInIIFE.types create mode 100644 tests/cases/conformance/salsa/typeLookupInIIFE.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 076830b47f851..e370ca59ed8a6 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2063,6 +2063,9 @@ namespace ts { if (initializer) { namespace = getSymbolOfNode(initializer); } + if (!namespace) { + return undefined; + } if (namespace.valueDeclaration && isVariableDeclaration(namespace.valueDeclaration) && namespace.valueDeclaration.initializer && diff --git a/tests/baselines/reference/typeLookupInIIFE.symbols b/tests/baselines/reference/typeLookupInIIFE.symbols new file mode 100644 index 0000000000000..1324328027428 --- /dev/null +++ b/tests/baselines/reference/typeLookupInIIFE.symbols @@ -0,0 +1,9 @@ +=== tests/cases/conformance/salsa/a.js === +// #22973 +var ns = (function() {})(); +>ns : Symbol(ns, Decl(a.js, 1, 3)) + +/** @type {ns.NotFound} */ +var crash; +>crash : Symbol(crash, Decl(a.js, 3, 3)) + diff --git a/tests/baselines/reference/typeLookupInIIFE.types b/tests/baselines/reference/typeLookupInIIFE.types new file mode 100644 index 0000000000000..83289c4b21413 --- /dev/null +++ b/tests/baselines/reference/typeLookupInIIFE.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/salsa/a.js === +// #22973 +var ns = (function() {})(); +>ns : void +>(function() {})() : void +>(function() {}) : () => void +>function() {} : () => void + +/** @type {ns.NotFound} */ +var crash; +>crash : any + diff --git a/tests/cases/conformance/salsa/typeLookupInIIFE.ts b/tests/cases/conformance/salsa/typeLookupInIIFE.ts new file mode 100644 index 0000000000000..52b76db639252 --- /dev/null +++ b/tests/cases/conformance/salsa/typeLookupInIIFE.ts @@ -0,0 +1,9 @@ +// @noEmit: true +// @allowJs: true +// @checkJs: true +// @noImplicitAny: true +// @Filename: a.js +// #22973 +var ns = (function() {})(); +/** @type {ns.NotFound} */ +var crash; From da781ba5be99ebc9a2c7f3fd6bf569800c8686be Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Thu, 5 Apr 2018 09:45:40 -0700 Subject: [PATCH 2/2] Comment the IIFE-fix line --- src/compiler/checker.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e370ca59ed8a6..811dbdcbc3d25 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2063,6 +2063,7 @@ namespace ts { if (initializer) { namespace = getSymbolOfNode(initializer); } + // Currently, IIFEs may not have a symbol and we don't know about their contents. Give up in this case. if (!namespace) { return undefined; }