From c49ef369643b31da83e4d5a071a54b390161cb0a Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Thu, 10 May 2018 16:51:46 -0700 Subject: [PATCH] First half of fix Still doesn't work correctly for multiple merges --- src/compiler/checker.ts | 7 +++++-- .../reference/typeFromPropertyAssignment14.types | 10 +++++----- .../reference/typeFromPropertyAssignment4.types | 10 +++++----- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index edefd6bf9d..fc82ebfa02 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -915,8 +915,11 @@ namespace ts { } if ((source.flags | target.flags) & SymbolFlags.JSContainer) { const sourceInitializer = getJSInitializerSymbol(source); - const targetInitializer = getJSInitializerSymbol(target); + let targetInitializer = getJSInitializerSymbol(target); if (sourceInitializer !== source || targetInitializer !== target) { + if (!(targetInitializer.flags & SymbolFlags.Transient)) { + targetInitializer = cloneSymbol(targetInitializer); + } mergeSymbol(targetInitializer, sourceInitializer); } } @@ -19452,7 +19455,7 @@ namespace ts { } const links = getNodeLinks(node); - const type = getTypeOfSymbol(node.symbol); + const type = getTypeOfSymbol(getMergedSymbol(node.symbol)); if (isTypeAny(type)) { return type; } diff --git a/tests/baselines/reference/typeFromPropertyAssignment14.types b/tests/baselines/reference/typeFromPropertyAssignment14.types index 10a3fa00e3..0416d2de95 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment14.types +++ b/tests/baselines/reference/typeFromPropertyAssignment14.types @@ -1,13 +1,13 @@ === tests/cases/conformance/salsa/def.js === var Outer = {}; ->Outer : typeof Outer ->{} : typeof Outer +>Outer : { [x: string]: any; Inner(): void; } +>{} : { [x: string]: any; Inner(): void; } === tests/cases/conformance/salsa/work.js === Outer.Inner = function () {} >Outer.Inner = function () {} : () => void >Outer.Inner : () => void ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner(): void; } >Inner : () => void >function () {} : () => void @@ -15,7 +15,7 @@ Outer.Inner.prototype = { >Outer.Inner.prototype = { x: 1, m() { }} : { [x: string]: any; x: number; m(): void; } >Outer.Inner.prototype : any >Outer.Inner : () => void ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner(): void; } >Inner : () => void >prototype : any >{ x: 1, m() { }} : { [x: string]: any; x: number; m(): void; } @@ -48,7 +48,7 @@ var inno = new Outer.Inner() >inno : { [x: string]: any; x: number; m(): void; } >new Outer.Inner() : { [x: string]: any; x: number; m(): void; } >Outer.Inner : () => void ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner(): void; } >Inner : () => void inno.x diff --git a/tests/baselines/reference/typeFromPropertyAssignment4.types b/tests/baselines/reference/typeFromPropertyAssignment4.types index 3b46296c10..90b97d91d0 100644 --- a/tests/baselines/reference/typeFromPropertyAssignment4.types +++ b/tests/baselines/reference/typeFromPropertyAssignment4.types @@ -1,13 +1,13 @@ === tests/cases/conformance/salsa/def.js === var Outer = {}; ->Outer : typeof Outer ->{} : typeof Outer +>Outer : { [x: string]: any; Inner: typeof Inner; } +>{} : { [x: string]: any; Inner: typeof Inner; } === tests/cases/conformance/salsa/a.js === Outer.Inner = class { >Outer.Inner = class { constructor() { /** @type {number} */ this.y = 12 }} : typeof Inner >Outer.Inner : typeof Inner ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: typeof Inner; } >Inner : typeof Inner >class { constructor() { /** @type {number} */ this.y = 12 }} : typeof Inner @@ -35,7 +35,7 @@ var inner = new Outer.Inner() >inner : Inner >new Outer.Inner() : Inner >Outer.Inner : typeof Inner ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: typeof Inner; } >Inner : typeof Inner inner.y @@ -57,7 +57,7 @@ var z = new Outer.Inner() >z : Inner >new Outer.Inner() : Inner >Outer.Inner : typeof Inner ->Outer : typeof Outer +>Outer : { [x: string]: any; Inner: typeof Inner; } >Inner : typeof Inner z.y