From 21506a444097ab267cb6129b8ab874e25652e06f Mon Sep 17 00:00:00 2001 From: Perryvw Date: Thu, 22 Aug 2024 22:18:08 +0200 Subject: [PATCH 1/3] Fix use of exported compileMembersOnly enums causing syntax errors --- src/transformation/visitors/access.ts | 17 +++++++++++++++-- test/unit/modules/modules.spec.ts | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/transformation/visitors/access.ts b/src/transformation/visitors/access.ts index 8004d9f2d..2688294db 100644 --- a/src/transformation/visitors/access.ts +++ b/src/transformation/visitors/access.ts @@ -9,7 +9,7 @@ import { unsupportedOptionalCompileMembersOnly, } from "../utils/diagnostics"; import { getExtensionKindForNode } from "../utils/language-extensions"; -import { addToNumericExpression } from "../utils/lua-ast"; +import { addToNumericExpression, createExportsIdentifier } from "../utils/lua-ast"; import { LuaLibFeature, transformLuaLibFunction } from "../utils/lualib"; import { isArrayType, isNumberType, isStringType } from "../utils/typescript"; import { tryGetConstEnumValue } from "./enum"; @@ -24,6 +24,7 @@ import { } from "./optional-chaining"; import { SyntaxKind } from "typescript"; import { getCustomNameFromSymbol } from "./identifier"; +import { getSymbolExportScope } from "../utils/export"; function addOneToArrayAccessArgument( context: TransformationContext, @@ -138,6 +139,7 @@ export function transformPropertyAccessExpressionWithCapture( if (isOptionalLeft) { context.diagnostics.push(unsupportedOptionalCompileMembersOnly(node)); } + if (ts.isPropertyAccessExpression(node.expression)) { // in case of ...x.enum.y transform to ...x.y const expression = lua.createTableIndexExpression( @@ -147,7 +149,18 @@ export function transformPropertyAccessExpressionWithCapture( ); return { expression }; } else { - return { expression: lua.createIdentifier(property, node) }; + // Check if we need to account for enum being exported int his file + if (symbol && getSymbolExportScope(context, type.symbol) === node.expression.getSourceFile()) { + return { + expression: lua.createTableIndexExpression( + createExportsIdentifier(), + lua.createStringLiteral(property), + node + ), + }; + } else { + return { expression: lua.createIdentifier(property, node) }; + } } } diff --git a/test/unit/modules/modules.spec.ts b/test/unit/modules/modules.spec.ts index bbe978226..d15f18463 100644 --- a/test/unit/modules/modules.spec.ts +++ b/test/unit/modules/modules.spec.ts @@ -291,3 +291,25 @@ test("import expression", () => { .setOptions({ module: ts.ModuleKind.ESNext }) .expectToEqual({ result: "foo" }); }); + +// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1572 +test("correctly exports @compileMembersOnly enums (#1572)", () => { + util.testModule` + export { val } from "./otherfile"; + ` + .addExtraFile( + "otherfile.ts", + ` + // Would put this in the main file, but we cannot transfer enum types over lua/js boundary + // but we still need to have an exported enum, hence it is in another file + /** @compileMembersOnly */ + export enum MyEnum { + A = 0, + B = 1, + C = 2 + } + export const val = MyEnum.B | MyEnum.C; + ` + ) + .expectToEqual({ val: 3 }); +}); From 50168b5ebf386c1aae6029c0ec9228f50db0f541 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Fri, 23 Aug 2024 22:09:55 +0200 Subject: [PATCH 2/3] fix test --- src/transformation/visitors/access.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/transformation/visitors/access.ts b/src/transformation/visitors/access.ts index 2688294db..4a1e6f273 100644 --- a/src/transformation/visitors/access.ts +++ b/src/transformation/visitors/access.ts @@ -24,7 +24,7 @@ import { } from "./optional-chaining"; import { SyntaxKind } from "typescript"; import { getCustomNameFromSymbol } from "./identifier"; -import { getSymbolExportScope } from "../utils/export"; +import { getSymbolExportScope, isSymbolExported } from "../utils/export"; function addOneToArrayAccessArgument( context: TransformationContext, @@ -150,7 +150,7 @@ export function transformPropertyAccessExpressionWithCapture( return { expression }; } else { // Check if we need to account for enum being exported int his file - if (symbol && getSymbolExportScope(context, type.symbol) === node.expression.getSourceFile()) { + if (isSymbolExported(context, type.symbol) && getSymbolExportScope(context, type.symbol) === node.expression.getSourceFile()) { return { expression: lua.createTableIndexExpression( createExportsIdentifier(), From 751246a49b5cc8b1d297e1d3007594684c6240d4 Mon Sep 17 00:00:00 2001 From: Perryvw Date: Sun, 25 Aug 2024 17:36:49 +0200 Subject: [PATCH 3/3] fix prettier --- src/transformation/visitors/access.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/transformation/visitors/access.ts b/src/transformation/visitors/access.ts index 4a1e6f273..c97c0f4c7 100644 --- a/src/transformation/visitors/access.ts +++ b/src/transformation/visitors/access.ts @@ -150,7 +150,10 @@ export function transformPropertyAccessExpressionWithCapture( return { expression }; } else { // Check if we need to account for enum being exported int his file - if (isSymbolExported(context, type.symbol) && getSymbolExportScope(context, type.symbol) === node.expression.getSourceFile()) { + if ( + isSymbolExported(context, type.symbol) && + getSymbolExportScope(context, type.symbol) === node.expression.getSourceFile() + ) { return { expression: lua.createTableIndexExpression( createExportsIdentifier(),