From 97ef321fa04b95e00ec0a3ff18d40457dd0e8c67 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Wed, 19 Jul 2023 15:52:19 -0400 Subject: [PATCH] Fix export of enum with same-named member (#55070) --- src/compiler/checker.ts | 4 +-- ...umWithMemberOfSameName(module=commonjs).js | 31 ++++++++++++++++ ...EnumWithMemberOfSameName(module=system).js | 36 +++++++++++++++++++ ...tionForModuleOrEnumWithMemberOfSameName.ts | 16 +++++++++ 4 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/exportDeclarationForModuleOrEnumWithMemberOfSameName(module=commonjs).js create mode 100644 tests/baselines/reference/exportDeclarationForModuleOrEnumWithMemberOfSameName(module=system).js create mode 100644 tests/cases/compiler/exportDeclarationForModuleOrEnumWithMemberOfSameName.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f6d1a9cae00..4bd721c6b13 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3040,8 +3040,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // (it refers to the constant type of the expression instead) return undefined; } - if (isModuleDeclaration(location) && lastLocation && location.name === lastLocation) { - // If this is the name of a namespace, skip the parent since it will have is own locals that could + if (isModuleOrEnumDeclaration(location) && lastLocation && location.name === lastLocation) { + // If lastLocation is the name of a namespace or enum, skip the parent since it will have is own locals that could // conflict. lastLocation = location; location = location.parent; diff --git a/tests/baselines/reference/exportDeclarationForModuleOrEnumWithMemberOfSameName(module=commonjs).js b/tests/baselines/reference/exportDeclarationForModuleOrEnumWithMemberOfSameName(module=commonjs).js new file mode 100644 index 00000000000..e8fe3f601b3 --- /dev/null +++ b/tests/baselines/reference/exportDeclarationForModuleOrEnumWithMemberOfSameName(module=commonjs).js @@ -0,0 +1,31 @@ +//// [tests/cases/compiler/exportDeclarationForModuleOrEnumWithMemberOfSameName.ts] //// + +//// [exportDeclarationForModuleOrEnumWithMemberOfSameName.ts] +// https://github.com/microsoft/TypeScript/issues/55038 + +namespace A { + export const A = 0; +} + +export { A } + +enum B { + B +} + +export { B } + + +//// [exportDeclarationForModuleOrEnumWithMemberOfSameName.js] +"use strict"; +// https://github.com/microsoft/TypeScript/issues/55038 +Object.defineProperty(exports, "__esModule", { value: true }); +exports.B = exports.A = void 0; +var A; +(function (A_1) { + A_1.A = 0; +})(A || (exports.A = A = {})); +var B; +(function (B) { + B[B["B"] = 0] = "B"; +})(B || (exports.B = B = {})); diff --git a/tests/baselines/reference/exportDeclarationForModuleOrEnumWithMemberOfSameName(module=system).js b/tests/baselines/reference/exportDeclarationForModuleOrEnumWithMemberOfSameName(module=system).js new file mode 100644 index 00000000000..7cd3a6e33a4 --- /dev/null +++ b/tests/baselines/reference/exportDeclarationForModuleOrEnumWithMemberOfSameName(module=system).js @@ -0,0 +1,36 @@ +//// [tests/cases/compiler/exportDeclarationForModuleOrEnumWithMemberOfSameName.ts] //// + +//// [exportDeclarationForModuleOrEnumWithMemberOfSameName.ts] +// https://github.com/microsoft/TypeScript/issues/55038 + +namespace A { + export const A = 0; +} + +export { A } + +enum B { + B +} + +export { B } + + +//// [exportDeclarationForModuleOrEnumWithMemberOfSameName.js] +// https://github.com/microsoft/TypeScript/issues/55038 +System.register([], function (exports_1, context_1) { + "use strict"; + var A, B; + var __moduleName = context_1 && context_1.id; + return { + setters: [], + execute: function () {// https://github.com/microsoft/TypeScript/issues/55038 + (function (A_1) { + A_1.A = 0; + })(A || (exports_1("A", A = {}))); + (function (B) { + B[B["B"] = 0] = "B"; + })(B || (exports_1("B", B = {}))); + } + }; +}); diff --git a/tests/cases/compiler/exportDeclarationForModuleOrEnumWithMemberOfSameName.ts b/tests/cases/compiler/exportDeclarationForModuleOrEnumWithMemberOfSameName.ts new file mode 100644 index 00000000000..bf7129d220e --- /dev/null +++ b/tests/cases/compiler/exportDeclarationForModuleOrEnumWithMemberOfSameName.ts @@ -0,0 +1,16 @@ +// @target: esnext +// @module: commonjs,system +// @noTypesAndSymbols: true +// https://github.com/microsoft/TypeScript/issues/55038 + +namespace A { + export const A = 0; +} + +export { A } + +enum B { + B +} + +export { B }