From cb32d48ac755444e72b1d0f2bc7531896de7e4c1 Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Tue, 7 Dec 2021 18:50:51 -0800 Subject: [PATCH 1/2] Fix enums and namespace merge --- src/compiler/checker.ts | 5 ++++- .../reference/enumWithExport.errors.txt | 12 ++++++++++++ tests/baselines/reference/enumWithExport.js | 16 ++++++++++++++++ tests/baselines/reference/enumWithExport.symbols | 13 +++++++++++++ tests/baselines/reference/enumWithExport.types | 15 +++++++++++++++ tests/cases/compiler/enumWithExport.ts | 6 ++++++ 6 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/enumWithExport.errors.txt create mode 100644 tests/baselines/reference/enumWithExport.js create mode 100644 tests/baselines/reference/enumWithExport.symbols create mode 100644 tests/baselines/reference/enumWithExport.types create mode 100644 tests/cases/compiler/enumWithExport.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 56a36f658d719..013717aab5444 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -39231,6 +39231,9 @@ namespace ts { if (!(nodeLinks.flags & NodeCheckFlags.EnumValuesComputed)) { nodeLinks.flags |= NodeCheckFlags.EnumValuesComputed; let autoValue: number | undefined = 0; + // if (!node.members) { + // return; + // } for (const member of node.members) { const value = computeMemberValue(member, autoValue); getNodeLinks(member).enumMemberValue = value; @@ -39377,7 +39380,7 @@ namespace ts { if (memberSymbol) { const declaration = memberSymbol.valueDeclaration; if (declaration !== member) { - if (declaration && isBlockScopedNameDeclaredBeforeUse(declaration, member)) { + if (declaration && isBlockScopedNameDeclaredBeforeUse(declaration, member) && isEnumDeclaration(declaration.parent)) { return getEnumMemberValue(declaration as EnumMember); } error(expr, Diagnostics.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums); diff --git a/tests/baselines/reference/enumWithExport.errors.txt b/tests/baselines/reference/enumWithExport.errors.txt new file mode 100644 index 0000000000000..486b7ed95e41f --- /dev/null +++ b/tests/baselines/reference/enumWithExport.errors.txt @@ -0,0 +1,12 @@ +tests/cases/compiler/enumWithExport.ts(5,7): error TS2651: A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums. + + +==== tests/cases/compiler/enumWithExport.ts (1 errors) ==== + namespace x { + export let y = 123 + } + enum x { + z = y + ~ +!!! error TS2651: A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums. + } \ No newline at end of file diff --git a/tests/baselines/reference/enumWithExport.js b/tests/baselines/reference/enumWithExport.js new file mode 100644 index 0000000000000..0660663b79704 --- /dev/null +++ b/tests/baselines/reference/enumWithExport.js @@ -0,0 +1,16 @@ +//// [enumWithExport.ts] +namespace x { + export let y = 123 +} +enum x { + z = y +} + +//// [enumWithExport.js] +var x; +(function (x) { + x.y = 123; +})(x || (x = {})); +(function (x) { + x[x["z"] = 0] = "z"; +})(x || (x = {})); diff --git a/tests/baselines/reference/enumWithExport.symbols b/tests/baselines/reference/enumWithExport.symbols new file mode 100644 index 0000000000000..4656d86d160f8 --- /dev/null +++ b/tests/baselines/reference/enumWithExport.symbols @@ -0,0 +1,13 @@ +=== tests/cases/compiler/enumWithExport.ts === +namespace x { +>x : Symbol(x, Decl(enumWithExport.ts, 0, 0), Decl(enumWithExport.ts, 2, 1)) + + export let y = 123 +>y : Symbol(y, Decl(enumWithExport.ts, 1, 12)) +} +enum x { +>x : Symbol(x, Decl(enumWithExport.ts, 0, 0), Decl(enumWithExport.ts, 2, 1)) + + z = y +>z : Symbol(x.z, Decl(enumWithExport.ts, 3, 8)) +} diff --git a/tests/baselines/reference/enumWithExport.types b/tests/baselines/reference/enumWithExport.types new file mode 100644 index 0000000000000..e616e9d4e1f86 --- /dev/null +++ b/tests/baselines/reference/enumWithExport.types @@ -0,0 +1,15 @@ +=== tests/cases/compiler/enumWithExport.ts === +namespace x { +>x : typeof x + + export let y = 123 +>y : number +>123 : 123 +} +enum x { +>x : x + + z = y +>z : x.z +>y : any +} diff --git a/tests/cases/compiler/enumWithExport.ts b/tests/cases/compiler/enumWithExport.ts new file mode 100644 index 0000000000000..0852a5b1a0079 --- /dev/null +++ b/tests/cases/compiler/enumWithExport.ts @@ -0,0 +1,6 @@ +namespace x { + export let y = 123 +} +enum x { + z = y +} \ No newline at end of file From e1af858afee600020e13a2d8405c9667f4bef7bc Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Tue, 7 Dec 2021 18:52:52 -0800 Subject: [PATCH 2/2] Remove unused comment --- src/compiler/checker.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 013717aab5444..3145e49a43c9e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -39231,9 +39231,6 @@ namespace ts { if (!(nodeLinks.flags & NodeCheckFlags.EnumValuesComputed)) { nodeLinks.flags |= NodeCheckFlags.EnumValuesComputed; let autoValue: number | undefined = 0; - // if (!node.members) { - // return; - // } for (const member of node.members) { const value = computeMemberValue(member, autoValue); getNodeLinks(member).enumMemberValue = value;