Skip to content

Commit f43a4fe

Browse files
authored
Fix resolving entity name of namespace member after alias is merged with type (#53387)
1 parent acfb0b5 commit f43a4fe

5 files changed

+141
-0
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4688,6 +4688,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
46884688
}
46894689
}
46904690
symbol = getMergedSymbol(getSymbol(getExportsOfSymbol(namespace), right.escapedText, meaning));
4691+
if (!symbol && (namespace.flags & SymbolFlags.Alias)) {
4692+
// `namespace` can be resolved further if there was a symbol merge with a re-export
4693+
symbol = getMergedSymbol(getSymbol(getExportsOfSymbol(resolveAlias(namespace)), right.escapedText, meaning));
4694+
}
46914695
if (!symbol) {
46924696
if (!ignoreErrors) {
46934697
const namespaceName = getFullyQualifiedName(namespace);
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//// [tests/cases/conformance/externalModules/exportTypeMergedWithExportStarAsNamespace.ts] ////
2+
3+
//// [usage.ts]
4+
import { Something } from "./prelude"
5+
export const myValue: Something<string> = Something.of("abc")
6+
export type MyType = Something.SubType<string>
7+
8+
//// [Something.ts]
9+
export type Something<A> = { value: A }
10+
export type SubType<A> = { value: A }
11+
export declare function of<A>(value: A): Something<A>
12+
13+
//// [prelude.ts]
14+
import * as S from "./Something"
15+
export * as Something from "./Something"
16+
export type Something<A> = S.Something<A>
17+
18+
19+
//// [Something.js]
20+
"use strict";
21+
Object.defineProperty(exports, "__esModule", { value: true });
22+
//// [prelude.js]
23+
"use strict";
24+
Object.defineProperty(exports, "__esModule", { value: true });
25+
exports.Something = void 0;
26+
exports.Something = require("./Something");
27+
//// [usage.js]
28+
"use strict";
29+
Object.defineProperty(exports, "__esModule", { value: true });
30+
exports.myValue = void 0;
31+
var prelude_1 = require("./prelude");
32+
exports.myValue = prelude_1.Something.of("abc");
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
=== tests/cases/conformance/externalModules/usage.ts ===
2+
import { Something } from "./prelude"
3+
>Something : Symbol(Something, Decl(usage.ts, 0, 8))
4+
5+
export const myValue: Something<string> = Something.of("abc")
6+
>myValue : Symbol(myValue, Decl(usage.ts, 1, 12))
7+
>Something : Symbol(Something, Decl(usage.ts, 0, 8))
8+
>Something.of : Symbol(of, Decl(Something.ts, 1, 37))
9+
>Something : Symbol(Something, Decl(usage.ts, 0, 8))
10+
>of : Symbol(of, Decl(Something.ts, 1, 37))
11+
12+
export type MyType = Something.SubType<string>
13+
>MyType : Symbol(MyType, Decl(usage.ts, 1, 61))
14+
>Something : Symbol(Something, Decl(usage.ts, 0, 8))
15+
>SubType : Symbol(SubType, Decl(Something.ts, 0, 39))
16+
17+
=== tests/cases/conformance/externalModules/Something.ts ===
18+
export type Something<A> = { value: A }
19+
>Something : Symbol(Something, Decl(Something.ts, 0, 0))
20+
>A : Symbol(A, Decl(Something.ts, 0, 22))
21+
>value : Symbol(value, Decl(Something.ts, 0, 28))
22+
>A : Symbol(A, Decl(Something.ts, 0, 22))
23+
24+
export type SubType<A> = { value: A }
25+
>SubType : Symbol(SubType, Decl(Something.ts, 0, 39))
26+
>A : Symbol(A, Decl(Something.ts, 1, 20))
27+
>value : Symbol(value, Decl(Something.ts, 1, 26))
28+
>A : Symbol(A, Decl(Something.ts, 1, 20))
29+
30+
export declare function of<A>(value: A): Something<A>
31+
>of : Symbol(of, Decl(Something.ts, 1, 37))
32+
>A : Symbol(A, Decl(Something.ts, 2, 27))
33+
>value : Symbol(value, Decl(Something.ts, 2, 30))
34+
>A : Symbol(A, Decl(Something.ts, 2, 27))
35+
>Something : Symbol(Something, Decl(Something.ts, 0, 0))
36+
>A : Symbol(A, Decl(Something.ts, 2, 27))
37+
38+
=== tests/cases/conformance/externalModules/prelude.ts ===
39+
import * as S from "./Something"
40+
>S : Symbol(S, Decl(prelude.ts, 0, 6))
41+
42+
export * as Something from "./Something"
43+
>Something : Symbol(Something, Decl(prelude.ts, 1, 6), Decl(prelude.ts, 1, 40))
44+
45+
export type Something<A> = S.Something<A>
46+
>Something : Symbol(Something, Decl(prelude.ts, 1, 6), Decl(prelude.ts, 1, 40))
47+
>A : Symbol(A, Decl(prelude.ts, 2, 22))
48+
>S : Symbol(S, Decl(prelude.ts, 0, 6))
49+
>Something : Symbol(S.Something, Decl(Something.ts, 0, 0))
50+
>A : Symbol(A, Decl(prelude.ts, 2, 22))
51+
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
=== tests/cases/conformance/externalModules/usage.ts ===
2+
import { Something } from "./prelude"
3+
>Something : typeof import("tests/cases/conformance/externalModules/Something")
4+
5+
export const myValue: Something<string> = Something.of("abc")
6+
>myValue : Something<string>
7+
>Something.of("abc") : import("tests/cases/conformance/externalModules/Something").Something<string>
8+
>Something.of : <A>(value: A) => import("tests/cases/conformance/externalModules/Something").Something<A>
9+
>Something : typeof import("tests/cases/conformance/externalModules/Something")
10+
>of : <A>(value: A) => import("tests/cases/conformance/externalModules/Something").Something<A>
11+
>"abc" : "abc"
12+
13+
export type MyType = Something.SubType<string>
14+
>MyType : { value: string; }
15+
>Something : any
16+
17+
=== tests/cases/conformance/externalModules/Something.ts ===
18+
export type Something<A> = { value: A }
19+
>Something : Something<A>
20+
>value : A
21+
22+
export type SubType<A> = { value: A }
23+
>SubType : SubType<A>
24+
>value : A
25+
26+
export declare function of<A>(value: A): Something<A>
27+
>of : <A>(value: A) => Something<A>
28+
>value : A
29+
30+
=== tests/cases/conformance/externalModules/prelude.ts ===
31+
import * as S from "./Something"
32+
>S : typeof S
33+
34+
export * as Something from "./Something"
35+
>Something : typeof S
36+
37+
export type Something<A> = S.Something<A>
38+
>Something : Something<A>
39+
>S : any
40+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @Filename: usage.ts
2+
import { Something } from "./prelude"
3+
export const myValue: Something<string> = Something.of("abc")
4+
export type MyType = Something.SubType<string>
5+
6+
// @Filename: Something.ts
7+
export type Something<A> = { value: A }
8+
export type SubType<A> = { value: A }
9+
export declare function of<A>(value: A): Something<A>
10+
11+
// @Filename: prelude.ts
12+
import * as S from "./Something"
13+
export * as Something from "./Something"
14+
export type Something<A> = S.Something<A>

0 commit comments

Comments
 (0)