From 534fc14c662cc49c1c71f3830b32f98ff7472e87 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Thu, 16 Sep 2021 20:15:41 +0300 Subject: [PATCH] fix(45850): Preserve const enums should keep import refs for exported const enums exported via named exports (#45858) --- src/compiler/checker.ts | 14 ++++++++++- .../constEnumPreserveEmitNamedExport1.js | 23 +++++++++++++++++++ .../constEnumPreserveEmitNamedExport1.symbols | 18 +++++++++++++++ .../constEnumPreserveEmitNamedExport1.types | 18 +++++++++++++++ .../constEnumPreserveEmitNamedExport2.js | 23 +++++++++++++++++++ .../constEnumPreserveEmitNamedExport2.symbols | 19 +++++++++++++++ .../constEnumPreserveEmitNamedExport2.types | 19 +++++++++++++++ .../constEnumPreserveEmitNamedExport1.ts | 12 ++++++++++ .../constEnumPreserveEmitNamedExport2.ts | 12 ++++++++++ 9 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/constEnumPreserveEmitNamedExport1.js create mode 100644 tests/baselines/reference/constEnumPreserveEmitNamedExport1.symbols create mode 100644 tests/baselines/reference/constEnumPreserveEmitNamedExport1.types create mode 100644 tests/baselines/reference/constEnumPreserveEmitNamedExport2.js create mode 100644 tests/baselines/reference/constEnumPreserveEmitNamedExport2.symbols create mode 100644 tests/baselines/reference/constEnumPreserveEmitNamedExport2.types create mode 100644 tests/cases/compiler/constEnumPreserveEmitNamedExport1.ts create mode 100644 tests/cases/compiler/constEnumPreserveEmitNamedExport2.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c204ef7d309..51c5001204f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -24477,7 +24477,19 @@ namespace ts { } function isExportOrExportExpression(location: Node) { - return !!findAncestor(location, e => e.parent && isExportAssignment(e.parent) && e.parent.expression === e && isEntityNameExpression(e)); + return !!findAncestor(location, n => { + const parent = n.parent; + if (parent === undefined) { + return "quit"; + } + if (isExportAssignment(parent)) { + return parent.expression === n && isEntityNameExpression(n); + } + if (isExportSpecifier(parent)) { + return parent.name === n || parent.propertyName === n; + } + return false; + }); } function markAliasReferenced(symbol: Symbol, location: Node) { diff --git a/tests/baselines/reference/constEnumPreserveEmitNamedExport1.js b/tests/baselines/reference/constEnumPreserveEmitNamedExport1.js new file mode 100644 index 00000000000..9468f9ebeae --- /dev/null +++ b/tests/baselines/reference/constEnumPreserveEmitNamedExport1.js @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/constEnumPreserveEmitNamedExport1.ts] //// + +//// [a.ts] +const enum A { + Foo +}; +export { A }; + +//// [b.ts] +import { A } from './a'; +export { A }; + + +//// [a.js] +var A; +(function (A) { + A[A["Foo"] = 0] = "Foo"; +})(A || (A = {})); +; +export { A }; +//// [b.js] +import { A } from './a'; +export { A }; diff --git a/tests/baselines/reference/constEnumPreserveEmitNamedExport1.symbols b/tests/baselines/reference/constEnumPreserveEmitNamedExport1.symbols new file mode 100644 index 00000000000..ea8f81526eb --- /dev/null +++ b/tests/baselines/reference/constEnumPreserveEmitNamedExport1.symbols @@ -0,0 +1,18 @@ +=== tests/cases/compiler/a.ts === +const enum A { +>A : Symbol(A, Decl(a.ts, 0, 0)) + + Foo +>Foo : Symbol(A.Foo, Decl(a.ts, 0, 14)) + +}; +export { A }; +>A : Symbol(A, Decl(a.ts, 3, 8)) + +=== tests/cases/compiler/b.ts === +import { A } from './a'; +>A : Symbol(A, Decl(b.ts, 0, 8)) + +export { A }; +>A : Symbol(A, Decl(b.ts, 1, 8)) + diff --git a/tests/baselines/reference/constEnumPreserveEmitNamedExport1.types b/tests/baselines/reference/constEnumPreserveEmitNamedExport1.types new file mode 100644 index 00000000000..41b1e8a19a4 --- /dev/null +++ b/tests/baselines/reference/constEnumPreserveEmitNamedExport1.types @@ -0,0 +1,18 @@ +=== tests/cases/compiler/a.ts === +const enum A { +>A : A + + Foo +>Foo : A.Foo + +}; +export { A }; +>A : typeof A + +=== tests/cases/compiler/b.ts === +import { A } from './a'; +>A : typeof A + +export { A }; +>A : typeof A + diff --git a/tests/baselines/reference/constEnumPreserveEmitNamedExport2.js b/tests/baselines/reference/constEnumPreserveEmitNamedExport2.js new file mode 100644 index 00000000000..cefc52deeb9 --- /dev/null +++ b/tests/baselines/reference/constEnumPreserveEmitNamedExport2.js @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/constEnumPreserveEmitNamedExport2.ts] //// + +//// [a.ts] +const enum A { + Foo +}; +export { A }; + +//// [b.ts] +import { A } from './a'; +export { A as B }; + + +//// [a.js] +var A; +(function (A) { + A[A["Foo"] = 0] = "Foo"; +})(A || (A = {})); +; +export { A }; +//// [b.js] +import { A } from './a'; +export { A as B }; diff --git a/tests/baselines/reference/constEnumPreserveEmitNamedExport2.symbols b/tests/baselines/reference/constEnumPreserveEmitNamedExport2.symbols new file mode 100644 index 00000000000..7c2d85e40d3 --- /dev/null +++ b/tests/baselines/reference/constEnumPreserveEmitNamedExport2.symbols @@ -0,0 +1,19 @@ +=== tests/cases/compiler/a.ts === +const enum A { +>A : Symbol(A, Decl(a.ts, 0, 0)) + + Foo +>Foo : Symbol(A.Foo, Decl(a.ts, 0, 14)) + +}; +export { A }; +>A : Symbol(A, Decl(a.ts, 3, 8)) + +=== tests/cases/compiler/b.ts === +import { A } from './a'; +>A : Symbol(A, Decl(b.ts, 0, 8)) + +export { A as B }; +>A : Symbol(A, Decl(b.ts, 0, 8)) +>B : Symbol(B, Decl(b.ts, 1, 8)) + diff --git a/tests/baselines/reference/constEnumPreserveEmitNamedExport2.types b/tests/baselines/reference/constEnumPreserveEmitNamedExport2.types new file mode 100644 index 00000000000..5b5e142254a --- /dev/null +++ b/tests/baselines/reference/constEnumPreserveEmitNamedExport2.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/a.ts === +const enum A { +>A : A + + Foo +>Foo : A.Foo + +}; +export { A }; +>A : typeof A + +=== tests/cases/compiler/b.ts === +import { A } from './a'; +>A : typeof A + +export { A as B }; +>A : typeof A +>B : typeof A + diff --git a/tests/cases/compiler/constEnumPreserveEmitNamedExport1.ts b/tests/cases/compiler/constEnumPreserveEmitNamedExport1.ts new file mode 100644 index 00000000000..e7fbdc82a86 --- /dev/null +++ b/tests/cases/compiler/constEnumPreserveEmitNamedExport1.ts @@ -0,0 +1,12 @@ +// @preserveConstEnums: true +// @target: esnext + +// @filename: a.ts +const enum A { + Foo +}; +export { A }; + +// @filename: b.ts +import { A } from './a'; +export { A }; diff --git a/tests/cases/compiler/constEnumPreserveEmitNamedExport2.ts b/tests/cases/compiler/constEnumPreserveEmitNamedExport2.ts new file mode 100644 index 00000000000..7b3a9281f0e --- /dev/null +++ b/tests/cases/compiler/constEnumPreserveEmitNamedExport2.ts @@ -0,0 +1,12 @@ +// @preserveConstEnums: true +// @target: esnext + +// @filename: a.ts +const enum A { + Foo +}; +export { A }; + +// @filename: b.ts +import { A } from './a'; +export { A as B };