From 2dff34e8c4a91c0005ca9ccfb7e045e225b6f2e4 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Wed, 19 Oct 2022 13:24:01 -0400 Subject: [PATCH] markAliasReferenced should include ExportValue as well (#51219) --- src/compiler/checker.ts | 4 +-- .../importElisionExportNonExportAndDefault.js | 20 +++++++++++++ ...rtElisionExportNonExportAndDefault.symbols | 25 ++++++++++++++++ ...portElisionExportNonExportAndDefault.types | 30 +++++++++++++++++++ .../importElisionExportNonExportAndDefault.ts | 13 ++++++++ 5 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/importElisionExportNonExportAndDefault.js create mode 100644 tests/baselines/reference/importElisionExportNonExportAndDefault.symbols create mode 100644 tests/baselines/reference/importElisionExportNonExportAndDefault.types create mode 100644 tests/cases/compiler/importElisionExportNonExportAndDefault.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ee02a3532eb3a..7a726c0757fe0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26035,13 +26035,13 @@ namespace ts { function markAliasReferenced(symbol: Symbol, location: Node) { if (isNonLocalAlias(symbol, /*excludes*/ SymbolFlags.Value) && !isInTypeQuery(location) && !getTypeOnlyAliasDeclaration(symbol, SymbolFlags.Value)) { const target = resolveAlias(symbol); - if (getAllSymbolFlags(target) & SymbolFlags.Value) { + if (getAllSymbolFlags(target) & (SymbolFlags.Value | SymbolFlags.ExportValue)) { // An alias resolving to a const enum cannot be elided if (1) 'isolatedModules' is enabled // (because the const enum value will not be inlined), or if (2) the alias is an export // of a const enum declaration that will be preserved. if (compilerOptions.isolatedModules || shouldPreserveConstEnums(compilerOptions) && isExportOrExportExpression(location) || - !isConstEnumOrConstEnumOnlyModule(target) + !isConstEnumOrConstEnumOnlyModule(getExportSymbolOfValueSymbolIfExported(target)) ) { markAliasSymbolAsReferenced(symbol); } diff --git a/tests/baselines/reference/importElisionExportNonExportAndDefault.js b/tests/baselines/reference/importElisionExportNonExportAndDefault.js new file mode 100644 index 0000000000000..ed9a318447afd --- /dev/null +++ b/tests/baselines/reference/importElisionExportNonExportAndDefault.js @@ -0,0 +1,20 @@ +//// [tests/cases/compiler/importElisionExportNonExportAndDefault.ts] //// + +//// [main.ts] +import MyFunction from "./MyComponent"; + +MyFunction({msg: "Hello World"}); + + +//// [MyComponent.ts] +interface MyFunction { msg: string; } + +export const MyFunction = ({ msg }: MyFunction) => console.log(`Got message "${msg}"`); +export default MyFunction; + +//// [MyComponent.js] +export const MyFunction = ({ msg }) => console.log(`Got message "${msg}"`); +export default MyFunction; +//// [main.js] +import MyFunction from "./MyComponent"; +MyFunction({ msg: "Hello World" }); diff --git a/tests/baselines/reference/importElisionExportNonExportAndDefault.symbols b/tests/baselines/reference/importElisionExportNonExportAndDefault.symbols new file mode 100644 index 0000000000000..310c072f3e9f1 --- /dev/null +++ b/tests/baselines/reference/importElisionExportNonExportAndDefault.symbols @@ -0,0 +1,25 @@ +=== tests/cases/compiler/main.ts === +import MyFunction from "./MyComponent"; +>MyFunction : Symbol(MyFunction, Decl(main.ts, 0, 6)) + +MyFunction({msg: "Hello World"}); +>msg : Symbol(msg, Decl(main.ts, 2, 12)) + + +=== tests/cases/compiler/MyComponent.ts === +interface MyFunction { msg: string; } +>MyFunction : Symbol(MyFunction, Decl(MyComponent.ts, 0, 0), Decl(MyComponent.ts, 2, 12)) +>msg : Symbol(MyFunction.msg, Decl(MyComponent.ts, 0, 22)) + +export const MyFunction = ({ msg }: MyFunction) => console.log(`Got message "${msg}"`); +>MyFunction : Symbol(MyFunction, Decl(MyComponent.ts, 2, 12)) +>msg : Symbol(msg, Decl(MyComponent.ts, 2, 28)) +>MyFunction : Symbol(MyFunction, Decl(MyComponent.ts, 0, 0), Decl(MyComponent.ts, 2, 12)) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>msg : Symbol(msg, Decl(MyComponent.ts, 2, 28)) + +export default MyFunction; +>MyFunction : Symbol(MyFunction, Decl(MyComponent.ts, 0, 0), Decl(MyComponent.ts, 2, 12)) + diff --git a/tests/baselines/reference/importElisionExportNonExportAndDefault.types b/tests/baselines/reference/importElisionExportNonExportAndDefault.types new file mode 100644 index 0000000000000..69aa6233ab6cb --- /dev/null +++ b/tests/baselines/reference/importElisionExportNonExportAndDefault.types @@ -0,0 +1,30 @@ +=== tests/cases/compiler/main.ts === +import MyFunction from "./MyComponent"; +>MyFunction : any + +MyFunction({msg: "Hello World"}); +>MyFunction({msg: "Hello World"}) : error +>MyFunction : error +>{msg: "Hello World"} : { msg: string; } +>msg : string +>"Hello World" : "Hello World" + + +=== tests/cases/compiler/MyComponent.ts === +interface MyFunction { msg: string; } +>msg : string + +export const MyFunction = ({ msg }: MyFunction) => console.log(`Got message "${msg}"`); +>MyFunction : ({ msg }: MyFunction) => void +>({ msg }: MyFunction) => console.log(`Got message "${msg}"`) : ({ msg }: MyFunction) => void +>msg : string +>console.log(`Got message "${msg}"`) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>`Got message "${msg}"` : string +>msg : string + +export default MyFunction; +>MyFunction : MyFunction + diff --git a/tests/cases/compiler/importElisionExportNonExportAndDefault.ts b/tests/cases/compiler/importElisionExportNonExportAndDefault.ts new file mode 100644 index 0000000000000..cc66bcd75c022 --- /dev/null +++ b/tests/cases/compiler/importElisionExportNonExportAndDefault.ts @@ -0,0 +1,13 @@ +// @target: esnext +// @module: esnext +// @filename: main.ts +import MyFunction from "./MyComponent"; + +MyFunction({msg: "Hello World"}); + + +// @filename: MyComponent.ts +interface MyFunction { msg: string; } + +export const MyFunction = ({ msg }: MyFunction) => console.log(`Got message "${msg}"`); +export default MyFunction; \ No newline at end of file