First half of fix

Still doesn't work correctly for multiple merges
This commit is contained in:
Nathan Shively-Sanders 2018-05-10 16:51:46 -07:00
parent fd17f77cc9
commit c49ef36964
3 changed files with 15 additions and 12 deletions

View file

@ -915,8 +915,11 @@ namespace ts {
} }
if ((source.flags | target.flags) & SymbolFlags.JSContainer) { if ((source.flags | target.flags) & SymbolFlags.JSContainer) {
const sourceInitializer = getJSInitializerSymbol(source); const sourceInitializer = getJSInitializerSymbol(source);
const targetInitializer = getJSInitializerSymbol(target); let targetInitializer = getJSInitializerSymbol(target);
if (sourceInitializer !== source || targetInitializer !== target) { if (sourceInitializer !== source || targetInitializer !== target) {
if (!(targetInitializer.flags & SymbolFlags.Transient)) {
targetInitializer = cloneSymbol(targetInitializer);
}
mergeSymbol(targetInitializer, sourceInitializer); mergeSymbol(targetInitializer, sourceInitializer);
} }
} }
@ -19452,7 +19455,7 @@ namespace ts {
} }
const links = getNodeLinks(node); const links = getNodeLinks(node);
const type = getTypeOfSymbol(node.symbol); const type = getTypeOfSymbol(getMergedSymbol(node.symbol));
if (isTypeAny(type)) { if (isTypeAny(type)) {
return type; return type;
} }

View file

@ -1,13 +1,13 @@
=== tests/cases/conformance/salsa/def.js === === tests/cases/conformance/salsa/def.js ===
var Outer = {}; var Outer = {};
>Outer : typeof Outer >Outer : { [x: string]: any; Inner(): void; }
>{} : typeof Outer >{} : { [x: string]: any; Inner(): void; }
=== tests/cases/conformance/salsa/work.js === === tests/cases/conformance/salsa/work.js ===
Outer.Inner = function () {} Outer.Inner = function () {}
>Outer.Inner = function () {} : () => void >Outer.Inner = function () {} : () => void
>Outer.Inner : () => void >Outer.Inner : () => void
>Outer : typeof Outer >Outer : { [x: string]: any; Inner(): void; }
>Inner : () => void >Inner : () => void
>function () {} : () => 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 = { x: 1, m() { }} : { [x: string]: any; x: number; m(): void; }
>Outer.Inner.prototype : any >Outer.Inner.prototype : any
>Outer.Inner : () => void >Outer.Inner : () => void
>Outer : typeof Outer >Outer : { [x: string]: any; Inner(): void; }
>Inner : () => void >Inner : () => void
>prototype : any >prototype : any
>{ x: 1, m() { }} : { [x: string]: any; x: number; m(): void; } >{ 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; } >inno : { [x: string]: any; x: number; m(): void; }
>new Outer.Inner() : { [x: string]: any; x: number; m(): void; } >new Outer.Inner() : { [x: string]: any; x: number; m(): void; }
>Outer.Inner : () => void >Outer.Inner : () => void
>Outer : typeof Outer >Outer : { [x: string]: any; Inner(): void; }
>Inner : () => void >Inner : () => void
inno.x inno.x

View file

@ -1,13 +1,13 @@
=== tests/cases/conformance/salsa/def.js === === tests/cases/conformance/salsa/def.js ===
var Outer = {}; var Outer = {};
>Outer : typeof Outer >Outer : { [x: string]: any; Inner: typeof Inner; }
>{} : typeof Outer >{} : { [x: string]: any; Inner: typeof Inner; }
=== tests/cases/conformance/salsa/a.js === === tests/cases/conformance/salsa/a.js ===
Outer.Inner = class { Outer.Inner = class {
>Outer.Inner = class { constructor() { /** @type {number} */ this.y = 12 }} : typeof Inner >Outer.Inner = class { constructor() { /** @type {number} */ this.y = 12 }} : typeof Inner
>Outer.Inner : typeof Inner >Outer.Inner : typeof Inner
>Outer : typeof Outer >Outer : { [x: string]: any; Inner: typeof Inner; }
>Inner : typeof Inner >Inner : typeof Inner
>class { constructor() { /** @type {number} */ this.y = 12 }} : typeof Inner >class { constructor() { /** @type {number} */ this.y = 12 }} : typeof Inner
@ -35,7 +35,7 @@ var inner = new Outer.Inner()
>inner : Inner >inner : Inner
>new Outer.Inner() : Inner >new Outer.Inner() : Inner
>Outer.Inner : typeof Inner >Outer.Inner : typeof Inner
>Outer : typeof Outer >Outer : { [x: string]: any; Inner: typeof Inner; }
>Inner : typeof Inner >Inner : typeof Inner
inner.y inner.y
@ -57,7 +57,7 @@ var z = new Outer.Inner()
>z : Inner >z : Inner
>new Outer.Inner() : Inner >new Outer.Inner() : Inner
>Outer.Inner : typeof Inner >Outer.Inner : typeof Inner
>Outer : typeof Outer >Outer : { [x: string]: any; Inner: typeof Inner; }
>Inner : typeof Inner >Inner : typeof Inner
z.y z.y