From 7db4b1cbc7790607fe7f04d7f95403c4388d1303 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Mon, 4 Jun 2018 13:34:23 -0700 Subject: [PATCH] Fix property assignment on aliases (#24659) Aliases don't have valueDeclarations, which caused a crash when passed to isJavascriptContainer before. --- src/compiler/binder.ts | 5 +++-- .../propertyAssignmentOnImportedSymbol.symbols | 11 +++++++++++ .../propertyAssignmentOnImportedSymbol.types | 16 ++++++++++++++++ .../salsa/propertyAssignmentOnImportedSymbol.ts | 8 ++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/propertyAssignmentOnImportedSymbol.symbols create mode 100644 tests/baselines/reference/propertyAssignmentOnImportedSymbol.types create mode 100644 tests/cases/conformance/salsa/propertyAssignmentOnImportedSymbol.ts diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index beee9823aa5..8b6ff01dd20 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2510,11 +2510,12 @@ namespace ts { * - with non-empty object literals if assigned to the prototype property */ function isJavascriptContainer(symbol: Symbol): boolean { - const node = symbol.valueDeclaration; if (symbol.flags & (SymbolFlags.Function | SymbolFlags.Class | SymbolFlags.NamespaceModule)) { return true; } - const init = isVariableDeclaration(node) ? node.initializer : + const node = symbol.valueDeclaration; + const init = !node ? undefined : + isVariableDeclaration(node) ? node.initializer : isBinaryExpression(node) ? node.right : isPropertyAccessExpression(node) && isBinaryExpression(node.parent) ? node.parent.right : undefined; diff --git a/tests/baselines/reference/propertyAssignmentOnImportedSymbol.symbols b/tests/baselines/reference/propertyAssignmentOnImportedSymbol.symbols new file mode 100644 index 00000000000..f8d01ae6981 --- /dev/null +++ b/tests/baselines/reference/propertyAssignmentOnImportedSymbol.symbols @@ -0,0 +1,11 @@ +=== tests/cases/conformance/salsa/mod1.js === +export var hurk = {} +>hurk : Symbol(hurk, Decl(mod1.js, 0, 10)) + +=== tests/cases/conformance/salsa/bug24658.js === +import { hurk } from './mod1' +>hurk : Symbol(hurk, Decl(bug24658.js, 0, 8)) + +hurk.expando = 4 +>hurk : Symbol(hurk, Decl(bug24658.js, 0, 8)) + diff --git a/tests/baselines/reference/propertyAssignmentOnImportedSymbol.types b/tests/baselines/reference/propertyAssignmentOnImportedSymbol.types new file mode 100644 index 00000000000..c14617911d1 --- /dev/null +++ b/tests/baselines/reference/propertyAssignmentOnImportedSymbol.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/salsa/mod1.js === +export var hurk = {} +>hurk : { [x: string]: any; } +>{} : { [x: string]: any; } + +=== tests/cases/conformance/salsa/bug24658.js === +import { hurk } from './mod1' +>hurk : { [x: string]: any; } + +hurk.expando = 4 +>hurk.expando = 4 : 4 +>hurk.expando : any +>hurk : { [x: string]: any; } +>expando : any +>4 : 4 + diff --git a/tests/cases/conformance/salsa/propertyAssignmentOnImportedSymbol.ts b/tests/cases/conformance/salsa/propertyAssignmentOnImportedSymbol.ts new file mode 100644 index 00000000000..083cf23baac --- /dev/null +++ b/tests/cases/conformance/salsa/propertyAssignmentOnImportedSymbol.ts @@ -0,0 +1,8 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @Filename: mod1.js +export var hurk = {} +// @Filename: bug24658.js +import { hurk } from './mod1' +hurk.expando = 4