diff --git a/src/Transpiler.ts b/src/Transpiler.ts index 395f1bcc3..976520303 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); @@ -294,13 +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 initializers allowed for enums.", node); + throw new TranspileError("Only numeric or string initializers allowed for enums.", node); } + } else if (hasStringInitializers) { + throw new TranspileError("Invalid heterogeneous enum.", node); } if (membersOnly) { @@ -313,7 +319,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/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/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/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/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/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 1a25cc171..7d6b730a2 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("Invalid heterogeneous enum") + public invalidHeterogeneousEnum() { + // Transpile & Assert + Expect(() => { + let lua = util.transpileString( + `enum TestEnum { + a, + b = "ok", + c, + }` + ); + }).toThrowError(Error, "Invalid heterogeneous enum."); + } + @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."); } }