From 0774bb81ceb1e47a85338d94a9ea01879e476d34 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Mon, 19 Nov 2018 13:29:46 -0800 Subject: [PATCH] Fix crash on property assignment of unresolved module (#28606) Previously, the compiler would crash when binding a non-top-level property assignment on the symbol of an unresolved module: ```js import x from 'arglebaz' { x.bar = 1 } ``` That's because `x` looks like an alias but doesn't have a valueDeclaration (since there is no file named 'arglebaz'), and the new code for binding Object.defineProperty calls forgot to check for an undefined valueDeclaration. This change adds the checks for an undefined valueDeclaration. --- src/compiler/binder.ts | 2 +- ...tyAssignmentOnUnresolvedImportedSymbol.errors.txt | 11 +++++++++++ ...pertyAssignmentOnUnresolvedImportedSymbol.symbols | 8 ++++++++ ...ropertyAssignmentOnUnresolvedImportedSymbol.types | 12 ++++++++++++ .../propertyAssignmentOnUnresolvedImportedSymbol.ts | 8 ++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.errors.txt create mode 100644 tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.symbols create mode 100644 tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.types create mode 100644 tests/cases/conformance/salsa/propertyAssignmentOnUnresolvedImportedSymbol.ts diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index fcd9b854c49..7cb321a95fa 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2608,7 +2608,7 @@ namespace ts { return true; } const node = symbol.valueDeclaration; - if (isCallExpression(node)) { + if (node && isCallExpression(node)) { return !!getAssignedExpandoInitializer(node); } let init = !node ? undefined : diff --git a/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.errors.txt b/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.errors.txt new file mode 100644 index 00000000000..447285b8328 --- /dev/null +++ b/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/salsa/bug28576.js(1,15): error TS2307: Cannot find module 'arglebaz'. + + +==== tests/cases/conformance/salsa/bug28576.js (1 errors) ==== + import x from 'arglebaz' + ~~~~~~~~~~ +!!! error TS2307: Cannot find module 'arglebaz'. + { + x.bar = 1 + } + \ No newline at end of file diff --git a/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.symbols b/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.symbols new file mode 100644 index 00000000000..3a190cbaa86 --- /dev/null +++ b/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.symbols @@ -0,0 +1,8 @@ +=== tests/cases/conformance/salsa/bug28576.js === +import x from 'arglebaz' +>x : Symbol(x, Decl(bug28576.js, 0, 6)) +{ + x.bar = 1 +>x : Symbol(x, Decl(bug28576.js, 0, 6)) +} + diff --git a/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.types b/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.types new file mode 100644 index 00000000000..5ff245f8475 --- /dev/null +++ b/tests/baselines/reference/propertyAssignmentOnUnresolvedImportedSymbol.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/salsa/bug28576.js === +import x from 'arglebaz' +>x : any +{ + x.bar = 1 +>x.bar = 1 : 1 +>x.bar : any +>x : any +>bar : any +>1 : 1 +} + diff --git a/tests/cases/conformance/salsa/propertyAssignmentOnUnresolvedImportedSymbol.ts b/tests/cases/conformance/salsa/propertyAssignmentOnUnresolvedImportedSymbol.ts new file mode 100644 index 00000000000..a879367e06f --- /dev/null +++ b/tests/cases/conformance/salsa/propertyAssignmentOnUnresolvedImportedSymbol.ts @@ -0,0 +1,8 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @Filename: bug28576.js +import x from 'arglebaz' +{ + x.bar = 1 +}