Skip to content

Commit dd98c17

Browse files
authored
Merge multiple symbols even when re-exported (microsoft#49987)
* Merge multiple symbols even when re-exported As far as I remember, the target of `mergeSymbol` needs to be a merged symbol, not a symbol with a mergeId that points to mergedSymbol. However, mergeSymbolTable didn't check for this. I can't remember if symbol tables may contain symbols-with-mergeId. If they can, then mergeSymbolTable needs to call getMergedSymbol on the individual targets of the merge. That's what I did in this PR. * Call getMergeSymbol eagerly On the source, not target, of mergeSymbolTable's contents
1 parent abc2a35 commit dd98c17

6 files changed

+191
-3
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1426,7 +1426,7 @@ namespace ts {
14261426
function mergeSymbolTable(target: SymbolTable, source: SymbolTable, unidirectional = false) {
14271427
source.forEach((sourceSymbol, id) => {
14281428
const targetSymbol = target.get(id);
1429-
target.set(id, targetSymbol ? mergeSymbol(targetSymbol, sourceSymbol, unidirectional) : sourceSymbol);
1429+
target.set(id, targetSymbol ? mergeSymbol(targetSymbol, sourceSymbol, unidirectional) : getMergedSymbol(sourceSymbol));
14301430
});
14311431
}
14321432

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
//// [tests/cases/compiler/mergeMultipleInterfacesReexported.ts] ////
2+
3+
//// [index.ts]
4+
export * from './eventList';
5+
6+
//// [test.ts]
7+
import { EventList } from "./eventList";
8+
9+
declare const p012: "p0" | "p1" | "p2"
10+
const t: keyof EventList = p012
11+
12+
//// [eventList.ts]
13+
export interface EventList {
14+
p0: [];
15+
}
16+
17+
//// [foo.ts]
18+
declare module './index' {
19+
interface EventList {
20+
p1: []
21+
}
22+
}
23+
export {};
24+
25+
26+
//// [bar.ts]
27+
declare module './index' {
28+
interface EventList {
29+
p2: []
30+
}
31+
}
32+
export {};
33+
34+
35+
//// [eventList.js]
36+
"use strict";
37+
exports.__esModule = true;
38+
//// [index.js]
39+
"use strict";
40+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
41+
if (k2 === undefined) k2 = k;
42+
var desc = Object.getOwnPropertyDescriptor(m, k);
43+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
44+
desc = { enumerable: true, get: function() { return m[k]; } };
45+
}
46+
Object.defineProperty(o, k2, desc);
47+
}) : (function(o, m, k, k2) {
48+
if (k2 === undefined) k2 = k;
49+
o[k2] = m[k];
50+
}));
51+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
52+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
53+
};
54+
exports.__esModule = true;
55+
__exportStar(require("./eventList"), exports);
56+
//// [test.js]
57+
"use strict";
58+
exports.__esModule = true;
59+
var t = p012;
60+
//// [foo.js]
61+
"use strict";
62+
exports.__esModule = true;
63+
//// [bar.js]
64+
"use strict";
65+
exports.__esModule = true;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
=== tests/cases/compiler/index.ts ===
2+
export * from './eventList';
3+
No type information for this code.
4+
No type information for this code.=== tests/cases/compiler/test.ts ===
5+
import { EventList } from "./eventList";
6+
>EventList : Symbol(EventList, Decl(test.ts, 0, 8))
7+
8+
declare const p012: "p0" | "p1" | "p2"
9+
>p012 : Symbol(p012, Decl(test.ts, 2, 13))
10+
11+
const t: keyof EventList = p012
12+
>t : Symbol(t, Decl(test.ts, 3, 5))
13+
>EventList : Symbol(EventList, Decl(test.ts, 0, 8))
14+
>p012 : Symbol(p012, Decl(test.ts, 2, 13))
15+
16+
=== tests/cases/compiler/eventList.ts ===
17+
export interface EventList {
18+
>EventList : Symbol(EventList, Decl(eventList.ts, 0, 0), Decl(foo.ts, 0, 26), Decl(bar.ts, 0, 26))
19+
20+
p0: [];
21+
>p0 : Symbol(EventList.p0, Decl(eventList.ts, 0, 28))
22+
}
23+
24+
=== tests/cases/compiler/foo.ts ===
25+
declare module './index' {
26+
>'./index' : Symbol("tests/cases/compiler/index", Decl(index.ts, 0, 0), Decl(foo.ts, 0, 0), Decl(bar.ts, 0, 0))
27+
28+
interface EventList {
29+
>EventList : Symbol(EventList, Decl(eventList.ts, 0, 0), Decl(foo.ts, 0, 26), Decl(bar.ts, 0, 26))
30+
31+
p1: []
32+
>p1 : Symbol(EventList.p1, Decl(foo.ts, 1, 25))
33+
}
34+
}
35+
export {};
36+
37+
38+
=== tests/cases/compiler/bar.ts ===
39+
declare module './index' {
40+
>'./index' : Symbol("tests/cases/compiler/index", Decl(index.ts, 0, 0), Decl(foo.ts, 0, 0), Decl(bar.ts, 0, 0))
41+
42+
interface EventList {
43+
>EventList : Symbol(EventList, Decl(eventList.ts, 0, 0), Decl(foo.ts, 0, 26), Decl(bar.ts, 0, 26))
44+
45+
p2: []
46+
>p2 : Symbol(EventList.p2, Decl(bar.ts, 1, 25))
47+
}
48+
}
49+
export {};
50+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
=== tests/cases/compiler/index.ts ===
2+
export * from './eventList';
3+
No type information for this code.
4+
No type information for this code.=== tests/cases/compiler/test.ts ===
5+
import { EventList } from "./eventList";
6+
>EventList : any
7+
8+
declare const p012: "p0" | "p1" | "p2"
9+
>p012 : "p0" | "p1" | "p2"
10+
11+
const t: keyof EventList = p012
12+
>t : keyof EventList
13+
>p012 : "p0" | "p1" | "p2"
14+
15+
=== tests/cases/compiler/eventList.ts ===
16+
export interface EventList {
17+
p0: [];
18+
>p0 : []
19+
}
20+
21+
=== tests/cases/compiler/foo.ts ===
22+
declare module './index' {
23+
>'./index' : typeof import("tests/cases/compiler/index")
24+
25+
interface EventList {
26+
p1: []
27+
>p1 : []
28+
}
29+
}
30+
export {};
31+
32+
33+
=== tests/cases/compiler/bar.ts ===
34+
declare module './index' {
35+
>'./index' : typeof import("tests/cases/compiler/index")
36+
37+
interface EventList {
38+
p2: []
39+
>p2 : []
40+
}
41+
}
42+
export {};
43+

tests/baselines/reference/moduleAugmentationDoesNamespaceEnumMergeOfReexport.symbols

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ const g: ns.Root = ns.Root.A;
4545
>ns : Symbol(ns, Decl(augment.ts, 0, 6))
4646
>Root : Symbol(ns.Root, Decl(file.ts, 0, 0), Decl(augment.ts, 2, 29))
4747
>ns.Root.A : Symbol(ns.Root.A, Decl(augment.ts, 4, 22))
48-
>ns.Root : Symbol(ns.Root, Decl(augment.ts, 2, 29))
48+
>ns.Root : Symbol(ns.Root, Decl(file.ts, 0, 0), Decl(augment.ts, 2, 29))
4949
>ns : Symbol(ns, Decl(augment.ts, 0, 6))
50-
>Root : Symbol(ns.Root, Decl(augment.ts, 2, 29))
50+
>Root : Symbol(ns.Root, Decl(file.ts, 0, 0), Decl(augment.ts, 2, 29))
5151
>A : Symbol(ns.Root.A, Decl(augment.ts, 4, 22))
5252

5353
f.x;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// @filename: index.ts
2+
export * from './eventList';
3+
4+
// @filename: test.ts
5+
import { EventList } from "./eventList";
6+
7+
declare const p012: "p0" | "p1" | "p2"
8+
const t: keyof EventList = p012
9+
10+
// @filename: eventList.ts
11+
export interface EventList {
12+
p0: [];
13+
}
14+
15+
// @filename: foo.ts
16+
declare module './index' {
17+
interface EventList {
18+
p1: []
19+
}
20+
}
21+
export {};
22+
23+
24+
// @filename: bar.ts
25+
declare module './index' {
26+
interface EventList {
27+
p2: []
28+
}
29+
}
30+
export {};

0 commit comments

Comments
 (0)