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) {
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;
}

View file

@ -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

View file

@ -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