From 9e4f9db75d8b9a7e13436a90fab685a9b9fe8e4b Mon Sep 17 00:00:00 2001 From: Zeng Jie Date: Tue, 10 Jul 2018 17:38:31 +0800 Subject: [PATCH 1/3] Allow string initializer for enums --- src/Transpiler.ts | 10 +++++++--- test/translation/lua/enum.lua | 3 ++- test/translation/lua/enumMembersOnly.lua | 1 + test/translation/ts/enum.ts | 5 +++-- test/translation/ts/enumMembersOnly.ts | 5 +++-- test/unit/enum.spec.ts | 18 ++++++++++++++++-- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/Transpiler.ts b/src/Transpiler.ts index 395f1bcc3..4d75c75e6 100644 --- a/src/Transpiler.ts +++ b/src/Transpiler.ts @@ -282,7 +282,7 @@ export abstract class LuaTranspiler { } public transpileEnum(node: ts.EnumDeclaration): string { - let val = 0; + let val: number | string = 0; let result = ""; const type = this.checker.getTypeAtLocation(node); @@ -298,8 +298,10 @@ export abstract class LuaTranspiler { if (member.initializer) { if (ts.isNumericLiteral(member.initializer)) { val = parseInt(member.initializer.text); + } else if (ts.isStringLiteral(member.initializer)) { + val = `"${member.initializer.text}"`; } else { - throw new TranspileError("Only numeric initializers allowed for enums.", node); + throw new TranspileError("Only numeric or string initializers allowed for enums.", node); } } @@ -313,7 +315,9 @@ export abstract class LuaTranspiler { result += this.indent + `${defName}=${val}\n`; } - val++; + if (typeof val === "number") { + val++; + } }); return result; } diff --git a/test/translation/lua/enum.lua b/test/translation/lua/enum.lua index 05168c99d..ccd628030 100644 --- a/test/translation/lua/enum.lua +++ b/test/translation/lua/enum.lua @@ -1,4 +1,5 @@ TestEnum={} TestEnum.val1=0 TestEnum.val2=2 -TestEnum.val3=3 \ No newline at end of file +TestEnum.val3=3 +TestEnum.val4="bye" \ No newline at end of file diff --git a/test/translation/lua/enumMembersOnly.lua b/test/translation/lua/enumMembersOnly.lua index 12b5ecc1c..e257d15f3 100644 --- a/test/translation/lua/enumMembersOnly.lua +++ b/test/translation/lua/enumMembersOnly.lua @@ -1,4 +1,5 @@ val1=0 val2=2 val3=3 +val4="bye" local a = val1 \ No newline at end of file diff --git a/test/translation/ts/enum.ts b/test/translation/ts/enum.ts index a59f7ac76..79a28f8c4 100644 --- a/test/translation/ts/enum.ts +++ b/test/translation/ts/enum.ts @@ -1,5 +1,6 @@ enum TestEnum { val1 = 0, val2 = 2, - val3 -} \ No newline at end of file + val3, + val4 = "bye" +} diff --git a/test/translation/ts/enumMembersOnly.ts b/test/translation/ts/enumMembersOnly.ts index 8b5174636..1032bea82 100644 --- a/test/translation/ts/enumMembersOnly.ts +++ b/test/translation/ts/enumMembersOnly.ts @@ -2,7 +2,8 @@ enum TestEnum { val1 = 0, val2 = 2, - val3 + val3, + val4 = "bye" } -const a = TestEnum.val1; \ No newline at end of file +const a = TestEnum.val1; diff --git a/test/unit/enum.spec.ts b/test/unit/enum.spec.ts index 1a25cc171..705314a08 100644 --- a/test/unit/enum.spec.ts +++ b/test/unit/enum.spec.ts @@ -2,17 +2,31 @@ import { Expect, Test, TestCase } from "alsatian"; import * as util from "../src/util" export class EnumTests { + @Test("String enum") + public stringEnum() { + // Transpile & Assert + Expect(() => { + let lua = util.transpileString( + `enum TestEnum { + val1 = "test", + val2 = "ok", + val3 = "bye" + }` + ); + }).not.toThrow(); + } + @Test("Unsuported enum") public unsuportedEnum() { // Transpile & Assert Expect(() => { let lua = util.transpileString( `enum TestEnum { - val1 = "test", + val1 = [], val2 = "ok", val3 = "bye" }` ); - }).toThrowError(Error, "Only numeric initializers allowed for enums."); + }).toThrowError(Error, "Only numeric or string initializers allowed for enums."); } } From 2b76593e829f831cf997584a15cf3eaf12b03c1f Mon Sep 17 00:00:00 2001 From: Zeng Jie Date: Sun, 15 Jul 2018 01:18:58 +0800 Subject: [PATCH 2/3] Add more test cases for enums. --- src/Transpiler.ts | 4 ++++ test/translation/lua/enumHeterogeneous.lua | 4 ++++ test/translation/lua/enumString.lua | 4 ++++ test/translation/ts/enumHeterogeneous.ts | 5 +++++ test/translation/ts/enumString.ts | 5 +++++ test/unit/enum.spec.ts | 12 ++++++------ 6 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 test/translation/lua/enumHeterogeneous.lua create mode 100644 test/translation/lua/enumString.lua create mode 100644 test/translation/ts/enumHeterogeneous.ts create mode 100644 test/translation/ts/enumString.ts diff --git a/src/Transpiler.ts b/src/Transpiler.ts index 4d75c75e6..976520303 100644 --- a/src/Transpiler.ts +++ b/src/Transpiler.ts @@ -294,15 +294,19 @@ export abstract class LuaTranspiler { result += this.makeExport(name, node); } + let hasStringInitializers = false; node.members.forEach(member => { if (member.initializer) { if (ts.isNumericLiteral(member.initializer)) { val = parseInt(member.initializer.text); } else if (ts.isStringLiteral(member.initializer)) { + hasStringInitializers = true; val = `"${member.initializer.text}"`; } else { throw new TranspileError("Only numeric or string initializers allowed for enums.", node); } + } else if (hasStringInitializers) { + throw new TranspileError("Invalid heterogeneous enum.", node); } if (membersOnly) { diff --git a/test/translation/lua/enumHeterogeneous.lua b/test/translation/lua/enumHeterogeneous.lua new file mode 100644 index 000000000..52fa024b9 --- /dev/null +++ b/test/translation/lua/enumHeterogeneous.lua @@ -0,0 +1,4 @@ +TestEnum={} +TestEnum.val1=0 +TestEnum.val2=3 +TestEnum.val3="baz" \ No newline at end of file diff --git a/test/translation/lua/enumString.lua b/test/translation/lua/enumString.lua new file mode 100644 index 000000000..7e44904d6 --- /dev/null +++ b/test/translation/lua/enumString.lua @@ -0,0 +1,4 @@ +TestEnum={} +TestEnum.val1="foo" +TestEnum.val2="bar" +TestEnum.val3="baz" \ No newline at end of file diff --git a/test/translation/ts/enumHeterogeneous.ts b/test/translation/ts/enumHeterogeneous.ts new file mode 100644 index 000000000..a047d66fe --- /dev/null +++ b/test/translation/ts/enumHeterogeneous.ts @@ -0,0 +1,5 @@ +enum TestEnum { + val1, + val2 = 3, + val3 = "baz", +} diff --git a/test/translation/ts/enumString.ts b/test/translation/ts/enumString.ts new file mode 100644 index 000000000..8ab7e30d1 --- /dev/null +++ b/test/translation/ts/enumString.ts @@ -0,0 +1,5 @@ +enum TestEnum { + val1 = "foo", + val2 = "bar", + val3 = "baz", +} diff --git a/test/unit/enum.spec.ts b/test/unit/enum.spec.ts index 705314a08..7d6b730a2 100644 --- a/test/unit/enum.spec.ts +++ b/test/unit/enum.spec.ts @@ -2,18 +2,18 @@ import { Expect, Test, TestCase } from "alsatian"; import * as util from "../src/util" export class EnumTests { - @Test("String enum") - public stringEnum() { + @Test("Invalid heterogeneous enum") + public invalidHeterogeneousEnum() { // Transpile & Assert Expect(() => { let lua = util.transpileString( `enum TestEnum { - val1 = "test", - val2 = "ok", - val3 = "bye" + a, + b = "ok", + c, }` ); - }).not.toThrow(); + }).toThrowError(Error, "Invalid heterogeneous enum."); } @Test("Unsuported enum") From 25a8fb0e1013e6866448e4a4b8fab7afd46a482d Mon Sep 17 00:00:00 2001 From: Zeng Jie Date: Sun, 15 Jul 2018 16:29:04 +0800 Subject: [PATCH 3/3] Revert original enum test cases. --- test/translation/lua/enum.lua | 3 +-- test/translation/ts/enum.ts | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/test/translation/lua/enum.lua b/test/translation/lua/enum.lua index ccd628030..05168c99d 100644 --- a/test/translation/lua/enum.lua +++ b/test/translation/lua/enum.lua @@ -1,5 +1,4 @@ TestEnum={} TestEnum.val1=0 TestEnum.val2=2 -TestEnum.val3=3 -TestEnum.val4="bye" \ No newline at end of file +TestEnum.val3=3 \ No newline at end of file diff --git a/test/translation/ts/enum.ts b/test/translation/ts/enum.ts index 79a28f8c4..a59f7ac76 100644 --- a/test/translation/ts/enum.ts +++ b/test/translation/ts/enum.ts @@ -1,6 +1,5 @@ enum TestEnum { val1 = 0, val2 = 2, - val3, - val4 = "bye" -} + val3 +} \ No newline at end of file