From f43a4fe4016d2fccea605d732773deeb401235d3 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 20 Mar 2023 15:16:08 -0700 Subject: [PATCH] Fix resolving entity name of namespace member after alias is merged with type (#53387) --- src/compiler/checker.ts | 4 ++ ...portTypeMergedWithExportStarAsNamespace.js | 32 ++++++++++++ ...ypeMergedWithExportStarAsNamespace.symbols | 51 +++++++++++++++++++ ...tTypeMergedWithExportStarAsNamespace.types | 40 +++++++++++++++ ...portTypeMergedWithExportStarAsNamespace.ts | 14 +++++ 5 files changed, 141 insertions(+) create mode 100644 tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.js create mode 100644 tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.symbols create mode 100644 tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.types create mode 100644 tests/cases/conformance/externalModules/exportTypeMergedWithExportStarAsNamespace.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2ccb41ae042..96fe6654820 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4688,6 +4688,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } symbol = getMergedSymbol(getSymbol(getExportsOfSymbol(namespace), right.escapedText, meaning)); + if (!symbol && (namespace.flags & SymbolFlags.Alias)) { + // `namespace` can be resolved further if there was a symbol merge with a re-export + symbol = getMergedSymbol(getSymbol(getExportsOfSymbol(resolveAlias(namespace)), right.escapedText, meaning)); + } if (!symbol) { if (!ignoreErrors) { const namespaceName = getFullyQualifiedName(namespace); diff --git a/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.js b/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.js new file mode 100644 index 00000000000..a783e23a6d8 --- /dev/null +++ b/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.js @@ -0,0 +1,32 @@ +//// [tests/cases/conformance/externalModules/exportTypeMergedWithExportStarAsNamespace.ts] //// + +//// [usage.ts] +import { Something } from "./prelude" +export const myValue: Something = Something.of("abc") +export type MyType = Something.SubType + +//// [Something.ts] +export type Something = { value: A } +export type SubType = { value: A } +export declare function of(value: A): Something + +//// [prelude.ts] +import * as S from "./Something" +export * as Something from "./Something" +export type Something = S.Something + + +//// [Something.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//// [prelude.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Something = void 0; +exports.Something = require("./Something"); +//// [usage.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.myValue = void 0; +var prelude_1 = require("./prelude"); +exports.myValue = prelude_1.Something.of("abc"); diff --git a/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.symbols b/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.symbols new file mode 100644 index 00000000000..0c0143f96c3 --- /dev/null +++ b/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.symbols @@ -0,0 +1,51 @@ +=== tests/cases/conformance/externalModules/usage.ts === +import { Something } from "./prelude" +>Something : Symbol(Something, Decl(usage.ts, 0, 8)) + +export const myValue: Something = Something.of("abc") +>myValue : Symbol(myValue, Decl(usage.ts, 1, 12)) +>Something : Symbol(Something, Decl(usage.ts, 0, 8)) +>Something.of : Symbol(of, Decl(Something.ts, 1, 37)) +>Something : Symbol(Something, Decl(usage.ts, 0, 8)) +>of : Symbol(of, Decl(Something.ts, 1, 37)) + +export type MyType = Something.SubType +>MyType : Symbol(MyType, Decl(usage.ts, 1, 61)) +>Something : Symbol(Something, Decl(usage.ts, 0, 8)) +>SubType : Symbol(SubType, Decl(Something.ts, 0, 39)) + +=== tests/cases/conformance/externalModules/Something.ts === +export type Something = { value: A } +>Something : Symbol(Something, Decl(Something.ts, 0, 0)) +>A : Symbol(A, Decl(Something.ts, 0, 22)) +>value : Symbol(value, Decl(Something.ts, 0, 28)) +>A : Symbol(A, Decl(Something.ts, 0, 22)) + +export type SubType = { value: A } +>SubType : Symbol(SubType, Decl(Something.ts, 0, 39)) +>A : Symbol(A, Decl(Something.ts, 1, 20)) +>value : Symbol(value, Decl(Something.ts, 1, 26)) +>A : Symbol(A, Decl(Something.ts, 1, 20)) + +export declare function of(value: A): Something +>of : Symbol(of, Decl(Something.ts, 1, 37)) +>A : Symbol(A, Decl(Something.ts, 2, 27)) +>value : Symbol(value, Decl(Something.ts, 2, 30)) +>A : Symbol(A, Decl(Something.ts, 2, 27)) +>Something : Symbol(Something, Decl(Something.ts, 0, 0)) +>A : Symbol(A, Decl(Something.ts, 2, 27)) + +=== tests/cases/conformance/externalModules/prelude.ts === +import * as S from "./Something" +>S : Symbol(S, Decl(prelude.ts, 0, 6)) + +export * as Something from "./Something" +>Something : Symbol(Something, Decl(prelude.ts, 1, 6), Decl(prelude.ts, 1, 40)) + +export type Something = S.Something +>Something : Symbol(Something, Decl(prelude.ts, 1, 6), Decl(prelude.ts, 1, 40)) +>A : Symbol(A, Decl(prelude.ts, 2, 22)) +>S : Symbol(S, Decl(prelude.ts, 0, 6)) +>Something : Symbol(S.Something, Decl(Something.ts, 0, 0)) +>A : Symbol(A, Decl(prelude.ts, 2, 22)) + diff --git a/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.types b/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.types new file mode 100644 index 00000000000..05e3c375643 --- /dev/null +++ b/tests/baselines/reference/exportTypeMergedWithExportStarAsNamespace.types @@ -0,0 +1,40 @@ +=== tests/cases/conformance/externalModules/usage.ts === +import { Something } from "./prelude" +>Something : typeof import("tests/cases/conformance/externalModules/Something") + +export const myValue: Something = Something.of("abc") +>myValue : Something +>Something.of("abc") : import("tests/cases/conformance/externalModules/Something").Something +>Something.of : (value: A) => import("tests/cases/conformance/externalModules/Something").Something +>Something : typeof import("tests/cases/conformance/externalModules/Something") +>of : (value: A) => import("tests/cases/conformance/externalModules/Something").Something +>"abc" : "abc" + +export type MyType = Something.SubType +>MyType : { value: string; } +>Something : any + +=== tests/cases/conformance/externalModules/Something.ts === +export type Something = { value: A } +>Something : Something +>value : A + +export type SubType = { value: A } +>SubType : SubType +>value : A + +export declare function of(value: A): Something +>of : (value: A) => Something +>value : A + +=== tests/cases/conformance/externalModules/prelude.ts === +import * as S from "./Something" +>S : typeof S + +export * as Something from "./Something" +>Something : typeof S + +export type Something = S.Something +>Something : Something +>S : any + diff --git a/tests/cases/conformance/externalModules/exportTypeMergedWithExportStarAsNamespace.ts b/tests/cases/conformance/externalModules/exportTypeMergedWithExportStarAsNamespace.ts new file mode 100644 index 00000000000..a9feef345b8 --- /dev/null +++ b/tests/cases/conformance/externalModules/exportTypeMergedWithExportStarAsNamespace.ts @@ -0,0 +1,14 @@ +// @Filename: usage.ts +import { Something } from "./prelude" +export const myValue: Something = Something.of("abc") +export type MyType = Something.SubType + +// @Filename: Something.ts +export type Something = { value: A } +export type SubType = { value: A } +export declare function of(value: A): Something + +// @Filename: prelude.ts +import * as S from "./Something" +export * as Something from "./Something" +export type Something = S.Something