From 84ff28b5294f1f1282ab7d32af87b787ec60e3e5 Mon Sep 17 00:00:00 2001 From: James <5511220+Zamiell@users.noreply.github.com> Date: Fri, 6 May 2022 21:47:52 -0400 Subject: [PATCH 1/5] adding option + test --- src/CompilerOptions.ts | 1 + src/cli/parse.ts | 5 +++++ .../functions/noImplicitGlobalVariables.spec.ts | 17 +++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 test/unit/functions/noImplicitGlobalVariables.spec.ts diff --git a/src/CompilerOptions.ts b/src/CompilerOptions.ts index d5023bf3f..5c9700097 100644 --- a/src/CompilerOptions.ts +++ b/src/CompilerOptions.ts @@ -29,6 +29,7 @@ export interface TypeScriptToLuaOptions { luaTarget?: LuaTarget; luaLibImport?: LuaLibImportKind; luaPlugins?: LuaPluginImport[]; + noImplicitGlobalVariables?: boolean; noImplicitSelf?: boolean; noHeader?: boolean; noResolvePaths?: string[]; diff --git a/src/cli/parse.ts b/src/cli/parse.ts index 4d113610f..2f72eb613 100644 --- a/src/cli/parse.ts +++ b/src/cli/parse.ts @@ -58,6 +58,11 @@ export const optionDeclarations: CommandLineOption[] = [ type: "enum", choices: Object.values(LuaTarget), }, + { + name: "noImplicitGlobalVariables", + description: "Specify to prevent implicitly turning \"normal\" variants into global variables in the transpiled output.", + type: "boolean", + }, { name: "noImplicitSelf", description: 'If "this" is implicitly considered an any type, do not generate a self parameter.', diff --git a/test/unit/functions/noImplicitGlobalVariables.spec.ts b/test/unit/functions/noImplicitGlobalVariables.spec.ts new file mode 100644 index 000000000..0739af352 --- /dev/null +++ b/test/unit/functions/noImplicitGlobalVariables.spec.ts @@ -0,0 +1,17 @@ +import * as util from "../../util"; + +test("noImplicitGlobalVariables does not create any global variables", () => { + const fooBuilder = util.testModule` + function foo() {} + const bar = 123; + ` + .setOptions({ noImplicitGlobalVariables: true }) + .expectToHaveNoDiagnostics(); + + const transpiledFile = fooBuilder.getLuaResult().transpiledFiles[0]; + util.assert(transpiledFile !== undefined); + const { lua } = transpiledFile; + util.assert(lua !== undefined); + expect(lua).toContain("local function foo("); + expect(lua).toContain("local bar ="); +}); From 6892bdc8a82bf7d6ee0e062cdf1e5a51b9cf2dcd Mon Sep 17 00:00:00 2001 From: James <5511220+Zamiell@users.noreply.github.com> Date: Fri, 6 May 2022 21:57:08 -0400 Subject: [PATCH 2/5] adding noImplicitGlobalVariables option --- src/transformation/utils/lua-ast.ts | 4 +++- .../functions/noImplicitGlobalVariables.spec.ts | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/transformation/utils/lua-ast.ts b/src/transformation/utils/lua-ast.ts index b894dba63..e2a3d2a9e 100644 --- a/src/transformation/utils/lua-ast.ts +++ b/src/transformation/utils/lua-ast.ts @@ -137,6 +137,8 @@ export function createLocalOrExportedOrGlobalDeclaration( let declaration: lua.VariableDeclarationStatement | undefined; let assignment: lua.AssignmentStatement | undefined; + const noImplicitGlobalVariables = context.options.noImplicitGlobalVariables === true; + const isFunctionDeclaration = tsOriginal !== undefined && ts.isFunctionDeclaration(tsOriginal); const identifiers = castArray(lhs); @@ -160,7 +162,7 @@ export function createLocalOrExportedOrGlobalDeclaration( const scope = peekScope(context); const isTopLevelVariable = scope.type === ScopeType.File; - if (context.isModule || !isTopLevelVariable) { + if (context.isModule || !isTopLevelVariable || noImplicitGlobalVariables) { const isLuaFunctionExpression = rhs && !Array.isArray(rhs) && lua.isFunctionExpression(rhs); const isSafeRecursiveFunctionDeclaration = isFunctionDeclaration && isLuaFunctionExpression; if (!isSafeRecursiveFunctionDeclaration && hasMultipleReferences(scope, lhs)) { diff --git a/test/unit/functions/noImplicitGlobalVariables.spec.ts b/test/unit/functions/noImplicitGlobalVariables.spec.ts index 0739af352..4da3cb3e7 100644 --- a/test/unit/functions/noImplicitGlobalVariables.spec.ts +++ b/test/unit/functions/noImplicitGlobalVariables.spec.ts @@ -1,5 +1,19 @@ import * as util from "../../util"; +test("normal TSTL creates global variables", () => { + const fooBuilder = util.testModule` + function foo() {} + const bar = 123; + ` + .expectToHaveNoDiagnostics(); + + const transpiledFile = fooBuilder.getLuaResult().transpiledFiles[0]; + util.assert(transpiledFile !== undefined); + const { lua } = transpiledFile; + util.assert(lua !== undefined); + expect(lua).not.toContain("local"); +}); + test("noImplicitGlobalVariables does not create any global variables", () => { const fooBuilder = util.testModule` function foo() {} From 5ea037c140a1eb638dfd271757c5c506854975dd Mon Sep 17 00:00:00 2001 From: James <5511220+Zamiell@users.noreply.github.com> Date: Fri, 6 May 2022 22:54:50 -0400 Subject: [PATCH 3/5] Update noImplicitGlobalVariables.spec.ts --- test/unit/functions/noImplicitGlobalVariables.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/unit/functions/noImplicitGlobalVariables.spec.ts b/test/unit/functions/noImplicitGlobalVariables.spec.ts index 4da3cb3e7..cc8fd6822 100644 --- a/test/unit/functions/noImplicitGlobalVariables.spec.ts +++ b/test/unit/functions/noImplicitGlobalVariables.spec.ts @@ -1,13 +1,13 @@ import * as util from "../../util"; test("normal TSTL creates global variables", () => { - const fooBuilder = util.testModule` + const builder = util.testModule` function foo() {} const bar = 123; ` .expectToHaveNoDiagnostics(); - const transpiledFile = fooBuilder.getLuaResult().transpiledFiles[0]; + const transpiledFile = builder.getLuaResult().transpiledFiles[0]; util.assert(transpiledFile !== undefined); const { lua } = transpiledFile; util.assert(lua !== undefined); @@ -15,14 +15,14 @@ test("normal TSTL creates global variables", () => { }); test("noImplicitGlobalVariables does not create any global variables", () => { - const fooBuilder = util.testModule` + const builder = util.testModule` function foo() {} const bar = 123; ` .setOptions({ noImplicitGlobalVariables: true }) .expectToHaveNoDiagnostics(); - const transpiledFile = fooBuilder.getLuaResult().transpiledFiles[0]; + const transpiledFile = builder.getLuaResult().transpiledFiles[0]; util.assert(transpiledFile !== undefined); const { lua } = transpiledFile; util.assert(lua !== undefined); From da9f58aef4eb8be1dcbb11a34910c5f854fd59db Mon Sep 17 00:00:00 2001 From: James <5511220+Zamiell@users.noreply.github.com> Date: Tue, 24 May 2022 01:24:38 -0400 Subject: [PATCH 4/5] prettier fix --- src/cli/parse.ts | 3 ++- test/unit/functions/noImplicitGlobalVariables.spec.ts | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cli/parse.ts b/src/cli/parse.ts index 2f72eb613..fbb104459 100644 --- a/src/cli/parse.ts +++ b/src/cli/parse.ts @@ -60,7 +60,8 @@ export const optionDeclarations: CommandLineOption[] = [ }, { name: "noImplicitGlobalVariables", - description: "Specify to prevent implicitly turning \"normal\" variants into global variables in the transpiled output.", + description: + 'Specify to prevent implicitly turning "normal" variants into global variables in the transpiled output.', type: "boolean", }, { diff --git a/test/unit/functions/noImplicitGlobalVariables.spec.ts b/test/unit/functions/noImplicitGlobalVariables.spec.ts index cc8fd6822..f8ea01256 100644 --- a/test/unit/functions/noImplicitGlobalVariables.spec.ts +++ b/test/unit/functions/noImplicitGlobalVariables.spec.ts @@ -4,12 +4,11 @@ test("normal TSTL creates global variables", () => { const builder = util.testModule` function foo() {} const bar = 123; - ` - .expectToHaveNoDiagnostics(); + `.expectToHaveNoDiagnostics(); const transpiledFile = builder.getLuaResult().transpiledFiles[0]; util.assert(transpiledFile !== undefined); - const { lua } = transpiledFile; + const { lua } = transpiledFile; util.assert(lua !== undefined); expect(lua).not.toContain("local"); }); @@ -24,7 +23,7 @@ test("noImplicitGlobalVariables does not create any global variables", () => { const transpiledFile = builder.getLuaResult().transpiledFiles[0]; util.assert(transpiledFile !== undefined); - const { lua } = transpiledFile; + const { lua } = transpiledFile; util.assert(lua !== undefined); expect(lua).toContain("local function foo("); expect(lua).toContain("local bar ="); From 1eab8d91780257f796e3312cd9227dff53d23bf4 Mon Sep 17 00:00:00 2001 From: James <5511220+Zamiell@users.noreply.github.com> Date: Sat, 28 May 2022 09:59:01 -0400 Subject: [PATCH 5/5] fix tests --- test/unit/functions/noImplicitGlobalVariables.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/unit/functions/noImplicitGlobalVariables.spec.ts b/test/unit/functions/noImplicitGlobalVariables.spec.ts index f8ea01256..00bd6195a 100644 --- a/test/unit/functions/noImplicitGlobalVariables.spec.ts +++ b/test/unit/functions/noImplicitGlobalVariables.spec.ts @@ -7,9 +7,9 @@ test("normal TSTL creates global variables", () => { `.expectToHaveNoDiagnostics(); const transpiledFile = builder.getLuaResult().transpiledFiles[0]; - util.assert(transpiledFile !== undefined); + expect(transpiledFile).toBeDefined(); const { lua } = transpiledFile; - util.assert(lua !== undefined); + expect(lua).toBeDefined(); expect(lua).not.toContain("local"); }); @@ -22,9 +22,9 @@ test("noImplicitGlobalVariables does not create any global variables", () => { .expectToHaveNoDiagnostics(); const transpiledFile = builder.getLuaResult().transpiledFiles[0]; - util.assert(transpiledFile !== undefined); + expect(transpiledFile).toBeDefined(); const { lua } = transpiledFile; - util.assert(lua !== undefined); + expect(lua).toBeDefined(); expect(lua).toContain("local function foo("); expect(lua).toContain("local bar ="); });