diff --git a/SUMMARY.md b/SUMMARY.md
index 25367a8f..0419c6f2 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -10,6 +10,7 @@
* [Arrays and Lists](docs/syntax/arrays-and-lists.md)
* [Sorting](docs/syntax/lists/sorting.md)
* [Dictionaries](docs/syntax/dictionaries.md)
+ * [Enums](docs/syntax/enums.md)
* [Classes](docs/syntax/classes.md)
* [Member Variables](docs/syntax/classes/member-variables.md)
* [Member Functions](docs/syntax/classes/member-functions.md)
diff --git a/docs/omissions.md b/docs/omissions.md
index 05b1a625..329a0f7f 100644
--- a/docs/omissions.md
+++ b/docs/omissions.md
@@ -44,6 +44,24 @@ If any target language doesn't reasonably support a feature, GLS cannot support
|
|
+
+ Enum Values as Numbers |
+ |
+ Abnormal |
+ |
+ |
+ |
+ |
+
+
+ Enum Values as Strings |
+ Missing |
+ |
+ |
+ |
+ |
+ |
+
Enums Without Values |
|
diff --git a/docs/syntax/enums.md b/docs/syntax/enums.md
new file mode 100644
index 00000000..b852e2aa
--- /dev/null
+++ b/docs/syntax/enums.md
@@ -0,0 +1,87 @@
+# Enums
+
+An "enum" is a container for a specific set of constant names that should be referenced by variables.
+Languages vary in their understanding of how to represent these fixed values, but all can achieve some equivalent.
+
+Start an enum with `enum start`, which takes in a PascalCase name of an enum.
+Ed an enum with `enum end`.
+
+Each enum value is declared with `enum member`, which takes in a PascalCase name of a member value, an integer value, and if not the last in the enum, a `,` comma.
+
+```gls
+enum start : Direction
+ enum member : Unknown 0 ,
+ enum member : Horizontal 1 ,
+ enum member : Vertical 2
+enum end
+```
+
+In C#:
+
+```csharp
+enum Direction
+{
+ Unknown = 0,
+ Horizontal = 1,
+ Vertical = 2
+}
+```
+
+In Python:
+
+```python
+class Direction(Enum):
+ Unknown = 0
+ Horizontal = 1
+ Vertical = 2
+```
+
+Enum types can be treated as their own type in type declarations.
+Later on, you can reference these enum values using the `enum` command, which takes in a name of an enum and a name of one of its values.
+
+```gls
+variable : direction Direction { enum : Direction Horizontal }
+```
+
+* In C#: `Direction direction = Direction.Horizontal;`
+* In Python: `direction = Direction.Horizontal`
+
+## Exports
+
+You can export enums from the current file by including the `export` keyword before the enum's name.
+
+```gls
+enum start : export Direction
+ enum member : Unknown 0 ,
+ enum member : Horizontal 1 ,
+ enum member : Vertical 2
+enum end
+```
+
+In C#:
+
+```csharp
+public enum Direction
+{
+ Unknown = 0,
+ Horizontal = 1,
+ Vertical = 2
+}
+```
+
+In Python:
+
+```python
+class Direction(Enum):
+ Unknown = 0
+ Horizontal = 1
+ Vertical = 2
+```
+
+## Notes
+
+Enums are fairly non-standard across languages.
+Don't assume member values to be anything more than a visual suggestion:
+
+* Some languages such as C# will sometimes later treat the values as string-likes, such as in string contatenation.
+* Some languages such as Java will skip printing them altogether.
diff --git a/docs/syntax/files.md b/docs/syntax/files.md
index b262e640..9f8a38c7 100644
--- a/docs/syntax/files.md
+++ b/docs/syntax/files.md
@@ -39,5 +39,6 @@ Note that because of [Java](https://docs.oracle.com/javase/specs/jls/se8/html/jl
You can use any of:
* `class start : export` to export a [class](./classes.md)
+* `enum start : export` to export an [enum](./enums.md)
* `interface start : export` to export an [interface](./interfaces.md)
* `standalone functions declare start : export` to export a [standalone function group](./standalone-functions.md)
diff --git a/src/Rendering/Commands/ClassStartCommand.ts b/src/Rendering/Commands/ClassStartCommand.ts
index 9c1c296c..5191d1ae 100644
--- a/src/Rendering/Commands/ClassStartCommand.ts
+++ b/src/Rendering/Commands/ClassStartCommand.ts
@@ -106,20 +106,20 @@ export class ClassStartCommand extends Command {
*/
private getForExport(remainingParameters: string[]): string {
if (remainingParameters[0] !== KeywordNames.Export) {
- return this.language.syntax.classes.exports.internal;
+ return this.language.syntax.exports.internal;
}
remainingParameters.shift();
- let exported = this.language.syntax.classes.exports.exportedLeft;
+ let exported = this.language.syntax.exports.exportedLeft;
- if (this.language.syntax.classes.exports.exportedIncludesName) {
+ if (this.language.syntax.exports.exportedIncludesName) {
if (remainingParameters[0] === KeywordNames.Abstract) {
exported += remainingParameters[1];
} else {
exported += remainingParameters[0];
}
- exported += this.language.syntax.classes.exports.exportedMiddle;
+ exported += this.language.syntax.exports.exportedMiddle;
}
return exported;
diff --git a/src/Rendering/Commands/EnumMemberCommand.ts b/src/Rendering/Commands/EnumMemberCommand.ts
index 58b71d18..fafb5a7a 100644
--- a/src/Rendering/Commands/EnumMemberCommand.ts
+++ b/src/Rendering/Commands/EnumMemberCommand.ts
@@ -1,7 +1,9 @@
import { LineResults } from "../LineResults";
import { CommandNames } from "../Names/CommandNames";
+import { KeywordNames } from "../Names/KeywordNames";
import { Command } from "./Command";
import { CommandMetadata } from "./Metadata/CommandMetadata";
+import { KeywordParameter } from "./Metadata/Parameters/KeywordParameter";
import { SingleParameter } from "./Metadata/Parameters/SingleParameter";
/**
@@ -16,7 +18,7 @@ export class EnumMemberCommand extends Command {
.withParameters([
new SingleParameter("memberName", "A member of the container enum.", true),
new SingleParameter("memberValue", "A value for the enum member.", true),
- new SingleParameter("comma", "Whether a comma is needed.", false),
+ new KeywordParameter([KeywordNames.CommaSymbol], "Whether a comma is needed.", false),
]);
/**
@@ -36,9 +38,12 @@ export class EnumMemberCommand extends Command {
let output = "";
output += parameters[1];
- output += this.language.syntax.enums.declareValueLeft;
- output += parameters[2];
- output += this.language.syntax.enums.declareValueRight;
+
+ if (this.language.syntax.enums.declareValues) {
+ output += this.language.syntax.enums.declareValueLeft;
+ output += parameters[2];
+ output += this.language.syntax.enums.declareValueRight;
+ }
if (parameters.length === 4) {
output += this.language.syntax.enums.declareCommaRight;
diff --git a/src/Rendering/Commands/EnumStartCommand.ts b/src/Rendering/Commands/EnumStartCommand.ts
index 2dce9bb9..5d7e819a 100644
--- a/src/Rendering/Commands/EnumStartCommand.ts
+++ b/src/Rendering/Commands/EnumStartCommand.ts
@@ -1,8 +1,11 @@
+import { GlsUtilities } from "../../GlsUtilities";
import { LineResults } from "../LineResults";
import { CommandNames } from "../Names/CommandNames";
+import { KeywordNames } from "../Names/KeywordNames";
import { Command } from "./Command";
import { CommandResult } from "./CommandResult";
import { CommandMetadata } from "./Metadata/CommandMetadata";
+import { KeywordParameter } from "./Metadata/Parameters/KeywordParameter";
import { SingleParameter } from "./Metadata/Parameters/SingleParameter";
import { addLineEnder } from "./Utilities";
@@ -16,7 +19,10 @@ export class EnumStartCommand extends Command {
private static metadata: CommandMetadata = new CommandMetadata(CommandNames.EnumStart)
.withDescription("Starts an enum declaration")
.withIndentation([1])
- .withParameters([new SingleParameter("name", "The name of the enum.", true)]);
+ .withParameters([
+ new KeywordParameter([KeywordNames.Export], "Keyword to export this enum publicly.", false),
+ new SingleParameter("name", "Name of the enum.", true),
+ ]);
/**
* @returns Metadata on the command.
@@ -32,14 +38,34 @@ export class EnumStartCommand extends Command {
* @returns Line(s) of code in the language.
*/
public render(parameters: string[]): LineResults {
- let line = "";
+ const remainingParameters = parameters.slice(1);
+ const isExported = this.getForExport(remainingParameters);
+ const lines: CommandResult[] = [new CommandResult("", 0)];
+ let lineStart = "";
- line += this.language.syntax.enums.declareStartLeft;
- line += parameters[1];
+ if (isExported) {
+ lineStart += GlsUtilities.stringReplaceAll(this.language.syntax.enums.declareExternal, "{0}", remainingParameters[0]);
+ } else {
+ lineStart += GlsUtilities.stringReplaceAll(this.language.syntax.enums.declareInternal, "{0}", remainingParameters[0]);
+ }
- const lines: CommandResult[] = [new CommandResult(line, 0)];
- addLineEnder(lines, this.language.syntax.enums.declareStartRight, 1);
+ addLineEnder(lines, lineStart, 1);
- return new LineResults(lines);
+ return new LineResults(lines).withImports(this.language.syntax.enums.requiredImports);
+ }
+
+ /**
+ * Removes any parameters for exporting the enum.
+ *
+ * @param remainingParameters Remaining input parameters.
+ * @returns Whether the enum is exported.
+ */
+ private getForExport(remainingParameters: string[]): boolean {
+ if (remainingParameters[0] !== KeywordNames.Export) {
+ return false;
+ }
+
+ remainingParameters.shift();
+ return true;
}
}
diff --git a/src/Rendering/Commands/InterfaceStartCommand.ts b/src/Rendering/Commands/InterfaceStartCommand.ts
index 9c447c8d..9d7abbfe 100644
--- a/src/Rendering/Commands/InterfaceStartCommand.ts
+++ b/src/Rendering/Commands/InterfaceStartCommand.ts
@@ -20,7 +20,7 @@ export class InterfaceStartCommand extends Command {
.withDescription("Starts an interface declaration")
.withIndentation([1])
.withParameters([
- new KeywordParameter([KeywordNames.Export], "Keyword to export this class publicly.", false),
+ new KeywordParameter([KeywordNames.Export], "Keyword to export this interface publicly.", false),
new SingleParameter("InterfaceName", "The interface name.", true),
new RepeatingParameters("Parent interfaces", [new SingleParameter("parentInterfaceName", "Names of parent interfaces.", true)]),
]);
@@ -75,15 +75,15 @@ export class InterfaceStartCommand extends Command {
*/
private getForExport(remainingParameters: string[]): string {
if (remainingParameters[0] !== KeywordNames.Export) {
- return this.language.syntax.classes.exports.internal;
+ return this.language.syntax.exports.internal;
}
remainingParameters.shift();
- let exported = this.language.syntax.classes.exports.exportedLeft;
+ let exported = this.language.syntax.exports.exportedLeft;
- if (this.language.syntax.classes.exports.exportedIncludesName) {
+ if (this.language.syntax.exports.exportedIncludesName) {
exported += remainingParameters[0];
- exported += this.language.syntax.classes.exports.exportedMiddle;
+ exported += this.language.syntax.exports.exportedMiddle;
}
return exported;
diff --git a/src/Rendering/Commands/StandaloneFunctionDeclareStartCommand.ts b/src/Rendering/Commands/StandaloneFunctionDeclareStartCommand.ts
index c7f872db..8b125ace 100644
--- a/src/Rendering/Commands/StandaloneFunctionDeclareStartCommand.ts
+++ b/src/Rendering/Commands/StandaloneFunctionDeclareStartCommand.ts
@@ -77,11 +77,11 @@ export class StandaloneFunctionDeclareStartCommand extends Command {
}
if (parameters[1] === KeywordNames.Public) {
- declaration += this.language.syntax.classes.exports.exportedLeft;
+ declaration += this.language.syntax.exports.exportedLeft;
- if (this.language.syntax.classes.exports.exportedIncludesName) {
+ if (this.language.syntax.exports.exportedIncludesName) {
declaration += functionName;
- declaration += this.language.syntax.classes.exports.exportedMiddle;
+ declaration += this.language.syntax.exports.exportedMiddle;
}
}
diff --git a/src/Rendering/Commands/StandaloneFunctionsDeclareStartCommand.ts b/src/Rendering/Commands/StandaloneFunctionsDeclareStartCommand.ts
index 03f831ef..5d2797c7 100644
--- a/src/Rendering/Commands/StandaloneFunctionsDeclareStartCommand.ts
+++ b/src/Rendering/Commands/StandaloneFunctionsDeclareStartCommand.ts
@@ -59,11 +59,11 @@ export class StandaloneFunctionsDeclareStartCommand extends Command {
}
if (parameters[1] === KeywordNames.Export) {
- let declaration: string = this.language.syntax.classes.exports.exportedLeft;
+ let declaration: string = this.language.syntax.exports.exportedLeft;
declaration += results.commandResults[0].text;
- if (this.language.syntax.classes.exports.exportedIncludesName) {
- declaration += this.language.syntax.classes.exports.exportedMiddle;
+ if (this.language.syntax.exports.exportedIncludesName) {
+ declaration += this.language.syntax.exports.exportedMiddle;
declaration += results.commandResults[0].text;
}
diff --git a/src/Rendering/Languages/CSharp.ts b/src/Rendering/Languages/CSharp.ts
index ed8ff069..71110bf8 100644
--- a/src/Rendering/Languages/CSharp.ts
+++ b/src/Rendering/Languages/CSharp.ts
@@ -7,7 +7,6 @@ import { ProjectProperties } from "./Properties/ProjectProperties";
import { ArrayNewSizedSyntax } from "./Properties/Syntax/ArrayNewSizedSyntax";
import { ArraySyntax } from "./Properties/Syntax/ArraySyntax";
import { BooleanSyntax } from "./Properties/Syntax/BooleanSyntax";
-import { ClassExportSyntax } from "./Properties/Syntax/ClassExportSyntax";
import { ClassGenericSyntax } from "./Properties/Syntax/ClassGenericSyntax";
import { ClassMemberFunctionSyntax } from "./Properties/Syntax/ClassMemberFunctionSyntax";
import { ClassMemberVariableSyntax } from "./Properties/Syntax/ClassMemberVariableSyntax";
@@ -19,6 +18,7 @@ import { ConditionalSyntax } from "./Properties/Syntax/ConditionalSyntax";
import { DictionarySyntax } from "./Properties/Syntax/DictionarySyntax";
import { EnumSyntax } from "./Properties/Syntax/EnumSyntax";
import { ExceptionSyntax } from "./Properties/Syntax/ExceptionSyntax";
+import { ExportSyntax } from "./Properties/Syntax/ExportSyntax";
import { FileSyntax } from "./Properties/Syntax/FileSyntax";
import { FunctionSyntax } from "./Properties/Syntax/FunctionSyntax";
import { ImportSyntax } from "./Properties/Syntax/ImportSyntax";
@@ -136,16 +136,6 @@ export class CSharp extends Language {
booleans.className = "bool";
}
- /**
- * Generates metadata on exported classes.
- *
- * @param members A property container for metadata on exported classes.
- */
- protected generateClassExportSyntax(exports: ClassExportSyntax): void {
- exports.exportedLeft = "public ";
- exports.internal = "";
- }
-
/**
* Generates metadata on class member functions.
*
@@ -340,17 +330,18 @@ export class CSharp extends Language {
* @param enums A property container for metadata on enums.
*/
protected generateEnumSyntax(enums: EnumSyntax): void {
- enums.declareStartLeft = "enum ";
+ enums.declareCommaRight = ",";
+ enums.declareLastRight = "";
+ enums.declareExternal = "public enum {0}\n{";
+ enums.declareInternal = "enum {0}\n{";
enums.declareValueLeft = " = ";
enums.declareValueRight = "";
- enums.declareCommaRight = ",";
+ enums.declareValues = true;
+ enums.isObject = false;
+ enums.requiredImports = [];
enums.valueLeft = "";
enums.valueMiddle = ".";
enums.valueRight = "";
-
- enums.declareStartRight = "\n{";
- enums.declareLastRight = "";
- enums.isObject = false;
}
/**
@@ -381,6 +372,16 @@ export class CSharp extends Language {
exceptions.variablePrefix = "";
}
+ /**
+ * Generates metadata on exported constructs.
+ *
+ * @param members A property container for metadata on exported constructs.
+ */
+ protected generateExportSyntax(exports: ExportSyntax): void {
+ exports.exportedLeft = "public ";
+ exports.internal = "";
+ }
+
/**
* Generates metadata on file contents.
*
diff --git a/src/Rendering/Languages/Java.ts b/src/Rendering/Languages/Java.ts
index 9d6d19c6..a5b6c0eb 100644
--- a/src/Rendering/Languages/Java.ts
+++ b/src/Rendering/Languages/Java.ts
@@ -7,7 +7,6 @@ import { ProjectProperties } from "./Properties/ProjectProperties";
import { ArrayNewSizedSyntax } from "./Properties/Syntax/ArrayNewSizedSyntax";
import { ArraySyntax } from "./Properties/Syntax/ArraySyntax";
import { BooleanSyntax } from "./Properties/Syntax/BooleanSyntax";
-import { ClassExportSyntax } from "./Properties/Syntax/ClassExportSyntax";
import { ClassGenericSyntax } from "./Properties/Syntax/ClassGenericSyntax";
import { ClassMemberFunctionSyntax } from "./Properties/Syntax/ClassMemberFunctionSyntax";
import { ClassMemberVariableSyntax } from "./Properties/Syntax/ClassMemberVariableSyntax";
@@ -19,6 +18,7 @@ import { ConditionalSyntax } from "./Properties/Syntax/ConditionalSyntax";
import { DictionarySyntax } from "./Properties/Syntax/DictionarySyntax";
import { EnumSyntax } from "./Properties/Syntax/EnumSyntax";
import { ExceptionSyntax } from "./Properties/Syntax/ExceptionSyntax";
+import { ExportSyntax } from "./Properties/Syntax/ExportSyntax";
import { FileSyntax } from "./Properties/Syntax/FileSyntax";
import { FunctionSyntax } from "./Properties/Syntax/FunctionSyntax";
import { ImportSyntax } from "./Properties/Syntax/ImportSyntax";
@@ -138,16 +138,6 @@ export class Java extends Language {
booleans.className = "boolean";
}
- /**
- * Generates metadata on exported classes.
- *
- * @param members A property container for metadata on exported classes.
- */
- protected generateClassExportSyntax(exports: ClassExportSyntax): void {
- exports.exportedLeft = "public ";
- exports.internal = "";
- }
-
/**
* Generates metadata on class member functions.
*
@@ -346,19 +336,16 @@ export class Java extends Language {
* @param enums A property container for metadata on enums.
*/
protected generateEnumSyntax(enums: EnumSyntax): void {
- enums.declareStartLeft = "enum ";
- enums.declareValueLeft = " = ";
- enums.declareValueRight = "";
enums.declareCommaRight = ",";
+ enums.declareLastRight = "";
+ enums.declareExternal = "enum {0} {";
+ enums.declareInternal = "enum {0} {";
+ enums.declareValues = false;
+ enums.isObject = false;
+ enums.requiredImports = [];
enums.valueLeft = "";
enums.valueMiddle = ".";
enums.valueRight = "";
-
- enums.declareStartRight = " {";
- enums.declareValueLeft = "(";
- enums.declareValueRight = ")";
- enums.declareLastRight = "";
- enums.isObject = false;
}
/**
@@ -385,6 +372,16 @@ export class Java extends Language {
exceptions.variablePrefix = "";
}
+ /**
+ * Generates metadata on exported constructs.
+ *
+ * @param members A property container for metadata on exported constructs.
+ */
+ protected generateExportSyntax(exports: ExportSyntax): void {
+ exports.exportedLeft = "public ";
+ exports.internal = "";
+ }
+
/**
* Generates metadata on file contents.
*
diff --git a/src/Rendering/Languages/JavaScript.ts b/src/Rendering/Languages/JavaScript.ts
index bfc8235f..46f1b6d9 100644
--- a/src/Rendering/Languages/JavaScript.ts
+++ b/src/Rendering/Languages/JavaScript.ts
@@ -5,7 +5,6 @@ import { ProjectProperties } from "./Properties/ProjectProperties";
import { ArrayNewSizedSyntax } from "./Properties/Syntax/ArrayNewSizedSyntax";
import { ArraySyntax } from "./Properties/Syntax/ArraySyntax";
import { BooleanSyntax } from "./Properties/Syntax/BooleanSyntax";
-import { ClassExportSyntax } from "./Properties/Syntax/ClassExportSyntax";
import { ClassGenericSyntax } from "./Properties/Syntax/ClassGenericSyntax";
import { ClassMemberFunctionSyntax } from "./Properties/Syntax/ClassMemberFunctionSyntax";
import { ClassMemberVariableSyntax } from "./Properties/Syntax/ClassMemberVariableSyntax";
@@ -17,6 +16,7 @@ import { ConditionalSyntax } from "./Properties/Syntax/ConditionalSyntax";
import { DictionarySyntax } from "./Properties/Syntax/DictionarySyntax";
import { EnumSyntax } from "./Properties/Syntax/EnumSyntax";
import { ExceptionSyntax } from "./Properties/Syntax/ExceptionSyntax";
+import { ExportSyntax } from "./Properties/Syntax/ExportSyntax";
import { FileSyntax } from "./Properties/Syntax/FileSyntax";
import { FunctionSyntax } from "./Properties/Syntax/FunctionSyntax";
import { ImportSyntax } from "./Properties/Syntax/ImportSyntax";
@@ -138,18 +138,6 @@ export class JavaScript extends Language {
booleans.className = "";
}
- /**
- * Generates metadata on exported classes.
- *
- * @param members A property container for metadata on exported classes.
- */
- protected generateClassExportSyntax(exports: ClassExportSyntax): void {
- exports.exportedIncludesName = true;
- exports.exportedLeft = "exports.";
- exports.exportedMiddle = " = ";
- exports.internal = "";
- }
-
/**
* Generates metadata on class member functions.
*
@@ -342,17 +330,18 @@ export class JavaScript extends Language {
* @param enums A property container for metadata on enums.
*/
protected generateEnumSyntax(enums: EnumSyntax): void {
- enums.declareValueRight = "";
enums.declareCommaRight = ",";
+ enums.declareLastRight = "";
+ enums.declareExternal = "const {0} = module.exports.{0} = {";
+ enums.declareInternal = "const {0} = {";
+ enums.declareValueLeft = ": ";
+ enums.declareValueRight = "";
+ enums.declareValues = true;
+ enums.isObject = true;
+ enums.requiredImports = [];
enums.valueLeft = "";
enums.valueMiddle = ".";
enums.valueRight = "";
-
- enums.declareStartLeft = "const ";
- enums.declareStartRight = " = {";
- enums.declareValueLeft = ": ";
- enums.declareLastRight = "";
- enums.isObject = true;
}
/**
@@ -379,6 +368,18 @@ export class JavaScript extends Language {
exceptions.variablePrefix = "";
}
+ /**
+ * Generates metadata on exported constructs.
+ *
+ * @param members A property container for metadata on exported constructs.
+ */
+ protected generateExportSyntax(exports: ExportSyntax): void {
+ exports.exportedIncludesName = true;
+ exports.exportedLeft = "exports.";
+ exports.exportedMiddle = " = ";
+ exports.internal = "";
+ }
+
/**
* Generates metadata on file contents.
*
diff --git a/src/Rendering/Languages/Language.ts b/src/Rendering/Languages/Language.ts
index b4885418..3f95b898 100644
--- a/src/Rendering/Languages/Language.ts
+++ b/src/Rendering/Languages/Language.ts
@@ -3,7 +3,6 @@ import { ProjectProperties } from "./Properties/ProjectProperties";
import { ArrayNewSizedSyntax } from "./Properties/Syntax/ArrayNewSizedSyntax";
import { ArraySyntax } from "./Properties/Syntax/ArraySyntax";
import { BooleanSyntax } from "./Properties/Syntax/BooleanSyntax";
-import { ClassExportSyntax } from "./Properties/Syntax/ClassExportSyntax";
import { ClassGenericSyntax } from "./Properties/Syntax/ClassGenericSyntax";
import { ClassMemberFunctionSyntax } from "./Properties/Syntax/ClassMemberFunctionSyntax";
import { ClassMemberVariableSyntax } from "./Properties/Syntax/ClassMemberVariableSyntax";
@@ -15,6 +14,7 @@ import { ConditionalSyntax } from "./Properties/Syntax/ConditionalSyntax";
import { DictionarySyntax } from "./Properties/Syntax/DictionarySyntax";
import { EnumSyntax } from "./Properties/Syntax/EnumSyntax";
import { ExceptionSyntax } from "./Properties/Syntax/ExceptionSyntax";
+import { ExportSyntax } from "./Properties/Syntax/ExportSyntax";
import { FileSyntax } from "./Properties/Syntax/FileSyntax";
import { FunctionSyntax } from "./Properties/Syntax/FunctionSyntax";
import { ImportSyntax } from "./Properties/Syntax/ImportSyntax";
@@ -77,7 +77,6 @@ export abstract class Language {
this.generateArrayNewSizedSyntax(this.syntax.arrays.newSized);
this.generateBooleanSyntax(this.syntax.booleans);
this.generateClassSyntax(this.syntax.classes);
- this.generateClassExportSyntax(this.syntax.classes.exports);
this.generateClassGenericSyntax(this.syntax.classes.generics);
this.generateClassMemberFunctionSyntax(this.syntax.classes.members.functions);
this.generateClassMemberVariableSyntax(this.syntax.classes.members.variables);
@@ -88,6 +87,7 @@ export abstract class Language {
this.generateDictionarySyntax(this.syntax.dictionaries);
this.generateEnumSyntax(this.syntax.enums);
this.generateExceptionSyntax(this.syntax.exceptions);
+ this.generateExportSyntax(this.syntax.exports);
this.generateFileSyntax(this.syntax.files);
this.generateFunctionSyntax(this.syntax.functions);
this.generateImportSyntax(this.syntax.imports);
@@ -154,16 +154,16 @@ export abstract class Language {
protected abstract generateBooleanSyntax(booleans: BooleanSyntax): void;
/**
- * Generates metadata on exported classes.
+ * Generates metadata on exported constructs.
*
- * @param members A property container for metadata on exported classes.
+ * @param exports A property container for metadata on exported constructs.
*/
- protected abstract generateClassExportSyntax(exports: ClassExportSyntax): void;
+ protected abstract generateExportSyntax(exports: ExportSyntax): void;
/**
* Generates metadata on class generics.
*
- * @param members A property container for metadata on class generics.
+ * @param generics A property container for metadata on class generics.
*/
protected abstract generateClassGenericSyntax(generics: ClassGenericSyntax): void;
diff --git a/src/Rendering/Languages/Properties/Syntax/ClassSyntax.ts b/src/Rendering/Languages/Properties/Syntax/ClassSyntax.ts
index a95a6013..067fdab7 100644
--- a/src/Rendering/Languages/Properties/Syntax/ClassSyntax.ts
+++ b/src/Rendering/Languages/Properties/Syntax/ClassSyntax.ts
@@ -1,5 +1,4 @@
import { ClassConstructorSyntax } from "./ClassConstructorSyntax";
-import { ClassExportSyntax } from "./ClassExportSyntax";
import { ClassGenericSyntax } from "./ClassGenericSyntax";
import { ClassMemberSyntax } from "./ClassMemberSyntax";
import { ClassStaticSyntax } from "./ClassStaticSyntax";
@@ -59,11 +58,6 @@ export class ClassSyntax {
*/
public declareStartRight: string;
- /**
- * Metadata on exported classes.
- */
- public exports: ClassExportSyntax = new ClassExportSyntax();
-
/**
* Metadata on generic (templated) types.
*/
diff --git a/src/Rendering/Languages/Properties/Syntax/EnumSyntax.ts b/src/Rendering/Languages/Properties/Syntax/EnumSyntax.ts
index 0ae60e72..b8d15c91 100644
--- a/src/Rendering/Languages/Properties/Syntax/EnumSyntax.ts
+++ b/src/Rendering/Languages/Properties/Syntax/EnumSyntax.ts
@@ -1,3 +1,5 @@
+import { Import } from "../../Imports/Import";
+
/**
* Metadata on a language's enum syntax.
*/
@@ -8,35 +10,45 @@ export class EnumSyntax {
public declareCommaRight: string;
/**
- * End line of an enum declaration.
+ * Line to declare an exported enum, with {0} for the enum's name.
*/
- public declareLastRight: string;
+ public declareExternal: string;
/**
- * Start of the first line of an enum declaration.
+ * Line to declare an internal (non-exported) enum, with {0} for the enum's name.
*/
- public declareStartLeft: string;
+ public declareInternal: string;
/**
- * End of the first line of an enum declaration.
+ * End line of an enum declaration.
*/
- public declareStartRight: string;
+ public declareLastRight: string;
/**
- * Start of a line declaring an enum member and value.
+ * Start of a line declaring an enum member's value.
*/
public declareValueLeft: string;
/**
- * End of a line declaring an enum member and value.
+ * End of a line declaring an enum member's value.
*/
public declareValueRight: string;
+ /**
+ * Whether members should explicitly declare their values.
+ */
+ public declareValues: boolean;
+
/**
* Whether enums act as a regular object.
*/
public isObject: boolean;
+ /**
+ * Imports required to declare enums.
+ */
+ public requiredImports: Import[];
+
/**
* Start of a line retrieving an enum value.
*/
diff --git a/src/Rendering/Languages/Properties/Syntax/ClassExportSyntax.ts b/src/Rendering/Languages/Properties/Syntax/ExportSyntax.ts
similarity index 94%
rename from src/Rendering/Languages/Properties/Syntax/ClassExportSyntax.ts
rename to src/Rendering/Languages/Properties/Syntax/ExportSyntax.ts
index b14ae8f8..d2d08a78 100644
--- a/src/Rendering/Languages/Properties/Syntax/ClassExportSyntax.ts
+++ b/src/Rendering/Languages/Properties/Syntax/ExportSyntax.ts
@@ -1,7 +1,7 @@
/**
* Metadata on a language's class export syntax.
*/
-export class ClassExportSyntax {
+export class ExportSyntax {
/**
* Whether exports exports include the name of exported items.
*/
diff --git a/src/Rendering/Languages/Properties/SyntaxProperties.ts b/src/Rendering/Languages/Properties/SyntaxProperties.ts
index 7cdba480..4eeaeb55 100644
--- a/src/Rendering/Languages/Properties/SyntaxProperties.ts
+++ b/src/Rendering/Languages/Properties/SyntaxProperties.ts
@@ -6,6 +6,7 @@ import { ConditionalSyntax } from "./Syntax/ConditionalSyntax";
import { DictionarySyntax } from "./Syntax/DictionarySyntax";
import { EnumSyntax } from "./Syntax/EnumSyntax";
import { ExceptionSyntax } from "./Syntax/ExceptionSyntax";
+import { ExportSyntax } from "./Syntax/ExportSyntax";
import { FileSyntax } from "./Syntax/FileSyntax";
import { FunctionSyntax } from "./Syntax/FunctionSyntax";
import { ImportSyntax } from "./Syntax/ImportSyntax";
@@ -70,6 +71,11 @@ export class SyntaxProperties {
*/
public exceptions: ExceptionSyntax;
+ /**
+ * Metadata on exported constructs.
+ */
+ public exports: ExportSyntax;
+
/**
* Metadata on file contents.
*/
@@ -177,6 +183,7 @@ export class SyntaxProperties {
this.dictionaries = new DictionarySyntax();
this.enums = new EnumSyntax();
this.exceptions = new ExceptionSyntax();
+ this.exports = new ExportSyntax();
this.files = new FileSyntax();
this.functions = new FunctionSyntax();
this.imports = new ImportSyntax();
diff --git a/src/Rendering/Languages/Python.ts b/src/Rendering/Languages/Python.ts
index 9712f92c..262cd8cc 100644
--- a/src/Rendering/Languages/Python.ts
+++ b/src/Rendering/Languages/Python.ts
@@ -7,7 +7,6 @@ import { ProjectProperties } from "./Properties/ProjectProperties";
import { ArrayNewSizedSyntax } from "./Properties/Syntax/ArrayNewSizedSyntax";
import { ArraySyntax } from "./Properties/Syntax/ArraySyntax";
import { BooleanSyntax } from "./Properties/Syntax/BooleanSyntax";
-import { ClassExportSyntax } from "./Properties/Syntax/ClassExportSyntax";
import { ClassGenericSyntax } from "./Properties/Syntax/ClassGenericSyntax";
import { ClassMemberFunctionSyntax } from "./Properties/Syntax/ClassMemberFunctionSyntax";
import { ClassMemberVariableSyntax } from "./Properties/Syntax/ClassMemberVariableSyntax";
@@ -19,6 +18,7 @@ import { ConditionalSyntax } from "./Properties/Syntax/ConditionalSyntax";
import { DictionarySyntax } from "./Properties/Syntax/DictionarySyntax";
import { EnumSyntax } from "./Properties/Syntax/EnumSyntax";
import { ExceptionSyntax } from "./Properties/Syntax/ExceptionSyntax";
+import { ExportSyntax } from "./Properties/Syntax/ExportSyntax";
import { FileSyntax } from "./Properties/Syntax/FileSyntax";
import { FunctionSyntax } from "./Properties/Syntax/FunctionSyntax";
import { ImportSyntax } from "./Properties/Syntax/ImportSyntax";
@@ -115,16 +115,6 @@ export class Python extends Language {
booleans.className = "bool";
}
- /**
- * Generates metadata on exported classes.
- *
- * @param members A property container for metadata on exported classes.
- */
- protected generateClassExportSyntax(exports: ClassExportSyntax): void {
- exports.exportedLeft = "";
- exports.internal = "";
- }
-
/**
* Generates metadata on class member functions.
*
@@ -311,17 +301,18 @@ export class Python extends Language {
* @param enums A property container for metadata on enums.
*/
protected generateEnumSyntax(enums: EnumSyntax): void {
- enums.declareStartLeft = "class ";
- enums.declareValueRight = "";
enums.declareCommaRight = "";
enums.declareLastRight = "";
- enums.valueLeft = "";
- enums.valueRight = "";
-
- enums.declareStartRight = "(Enum):";
+ enums.declareExternal = "class {0}(Enum):";
+ enums.declareInternal = "class {0}(Enum):";
enums.declareValueLeft = " = ";
- enums.valueMiddle = ".";
+ enums.declareValueRight = "";
+ enums.declareValues = true;
enums.isObject = false;
+ enums.requiredImports = [new Import(["enum"], ["Enum"], ImportRelativity.Absolute)];
+ enums.valueLeft = "";
+ enums.valueMiddle = ".";
+ enums.valueRight = "";
}
/**
@@ -348,6 +339,16 @@ export class Python extends Language {
exceptions.variablePrefix = "";
}
+ /**
+ * Generates metadata on exported constructs.
+ *
+ * @param members A property container for metadata on exported constructs.
+ */
+ protected generateExportSyntax(exports: ExportSyntax): void {
+ exports.exportedLeft = "";
+ exports.internal = "";
+ }
+
/**
* Generates metadata on file contents.
*
diff --git a/src/Rendering/Languages/Ruby.ts b/src/Rendering/Languages/Ruby.ts
index ec6614d7..c87f5939 100644
--- a/src/Rendering/Languages/Ruby.ts
+++ b/src/Rendering/Languages/Ruby.ts
@@ -7,7 +7,6 @@ import { ProjectProperties } from "./Properties/ProjectProperties";
import { ArrayNewSizedSyntax } from "./Properties/Syntax/ArrayNewSizedSyntax";
import { ArraySyntax } from "./Properties/Syntax/ArraySyntax";
import { BooleanSyntax } from "./Properties/Syntax/BooleanSyntax";
-import { ClassExportSyntax } from "./Properties/Syntax/ClassExportSyntax";
import { ClassGenericSyntax } from "./Properties/Syntax/ClassGenericSyntax";
import { ClassMemberFunctionSyntax } from "./Properties/Syntax/ClassMemberFunctionSyntax";
import { ClassMemberVariableSyntax } from "./Properties/Syntax/ClassMemberVariableSyntax";
@@ -19,6 +18,7 @@ import { ConditionalSyntax } from "./Properties/Syntax/ConditionalSyntax";
import { DictionarySyntax } from "./Properties/Syntax/DictionarySyntax";
import { EnumSyntax } from "./Properties/Syntax/EnumSyntax";
import { ExceptionSyntax } from "./Properties/Syntax/ExceptionSyntax";
+import { ExportSyntax } from "./Properties/Syntax/ExportSyntax";
import { FileSyntax } from "./Properties/Syntax/FileSyntax";
import { FunctionSyntax } from "./Properties/Syntax/FunctionSyntax";
import { ImportSyntax } from "./Properties/Syntax/ImportSyntax";
@@ -137,16 +137,6 @@ export class Ruby extends Language {
booleans.className = "";
}
- /**
- * Generates metadata on exported classes.
- *
- * @param members A property container for metadata on exported classes.
- */
- protected generateClassExportSyntax(exports: ClassExportSyntax): void {
- exports.exportedLeft = "";
- exports.internal = "";
- }
-
/**
* Generates metadata on class member functions.
*
@@ -339,17 +329,18 @@ export class Ruby extends Language {
* @param enums A property container for metadata on enums.
*/
protected generateEnumSyntax(enums: EnumSyntax): void {
- enums.declareStartLeft = "class ";
- enums.declareValueRight = "";
enums.declareCommaRight = "";
enums.declareLastRight = "";
- enums.valueLeft = "";
- enums.valueRight = "";
-
- enums.declareStartRight = "";
+ enums.declareExternal = "class {0}";
+ enums.declareInternal = "class {0}";
enums.declareValueLeft = " = ";
- enums.valueMiddle = "::";
+ enums.declareValueRight = "";
+ enums.declareValues = true;
enums.isObject = false;
+ enums.requiredImports = [];
+ enums.valueLeft = "";
+ enums.valueMiddle = "::";
+ enums.valueRight = "";
}
/**
@@ -376,6 +367,16 @@ export class Ruby extends Language {
exceptions.variablePrefix = "";
}
+ /**
+ * Generates metadata on exported constructs.
+ *
+ * @param members A property container for metadata on exported constructs.
+ */
+ protected generateExportSyntax(exports: ExportSyntax): void {
+ exports.exportedLeft = "";
+ exports.internal = "";
+ }
+
/**
* Generates metadata on file contents.
*
diff --git a/src/Rendering/Languages/TypeScript.ts b/src/Rendering/Languages/TypeScript.ts
index 22ff57cc..a7c16b7c 100644
--- a/src/Rendering/Languages/TypeScript.ts
+++ b/src/Rendering/Languages/TypeScript.ts
@@ -5,7 +5,6 @@ import { ProjectProperties } from "./Properties/ProjectProperties";
import { ArrayNewSizedSyntax } from "./Properties/Syntax/ArrayNewSizedSyntax";
import { ArraySyntax } from "./Properties/Syntax/ArraySyntax";
import { BooleanSyntax } from "./Properties/Syntax/BooleanSyntax";
-import { ClassExportSyntax } from "./Properties/Syntax/ClassExportSyntax";
import { ClassGenericSyntax } from "./Properties/Syntax/ClassGenericSyntax";
import { ClassMemberFunctionSyntax } from "./Properties/Syntax/ClassMemberFunctionSyntax";
import { ClassMemberVariableSyntax } from "./Properties/Syntax/ClassMemberVariableSyntax";
@@ -17,6 +16,7 @@ import { ConditionalSyntax } from "./Properties/Syntax/ConditionalSyntax";
import { DictionarySyntax } from "./Properties/Syntax/DictionarySyntax";
import { EnumSyntax } from "./Properties/Syntax/EnumSyntax";
import { ExceptionSyntax } from "./Properties/Syntax/ExceptionSyntax";
+import { ExportSyntax } from "./Properties/Syntax/ExportSyntax";
import { FileSyntax } from "./Properties/Syntax/FileSyntax";
import { FunctionSyntax } from "./Properties/Syntax/FunctionSyntax";
import { ImportSyntax } from "./Properties/Syntax/ImportSyntax";
@@ -139,16 +139,6 @@ export class TypeScript extends Language {
booleans.className = "boolean";
}
- /**
- * Generates metadata on exported classes.
- *
- * @param members A property container for metadata on exported classes.
- */
- protected generateClassExportSyntax(exports: ClassExportSyntax): void {
- exports.exportedLeft = "export ";
- exports.internal = "";
- }
-
/**
* Generates metadata on class member functions.
*
@@ -347,17 +337,18 @@ export class TypeScript extends Language {
* @param enums A property container for metadata on enums.
*/
protected generateEnumSyntax(enums: EnumSyntax): void {
- enums.declareStartLeft = "enum ";
+ enums.declareCommaRight = ",";
+ enums.declareLastRight = "";
+ enums.declareExternal = "export enum {0} {";
+ enums.declareInternal = "enum {0} {";
enums.declareValueLeft = " = ";
enums.declareValueRight = "";
- enums.declareCommaRight = ",";
+ enums.declareValues = true;
+ enums.isObject = false;
+ enums.requiredImports = [];
enums.valueLeft = "";
enums.valueMiddle = ".";
enums.valueRight = "";
-
- enums.declareStartRight = " {";
- enums.declareLastRight = "";
- enums.isObject = false;
}
/**
@@ -386,6 +377,16 @@ export class TypeScript extends Language {
exceptions.requiresExceptionType = false;
}
+ /**
+ * Generates metadata on exported constructs.
+ *
+ * @param members A property container for metadata on exported constructs.
+ */
+ protected generateExportSyntax(exports: ExportSyntax): void {
+ exports.exportedLeft = "export ";
+ exports.internal = "";
+ }
+
/**
* Generates metadata on file contents.
*
diff --git a/src/Rendering/Names/KeywordNames.ts b/src/Rendering/Names/KeywordNames.ts
index 81b4f212..e629c7b0 100644
--- a/src/Rendering/Names/KeywordNames.ts
+++ b/src/Rendering/Names/KeywordNames.ts
@@ -12,6 +12,11 @@ export class KeywordNames {
*/
public static Base = "base";
+ /**
+ * Name key for the "," symbol.
+ */
+ public static CommaSymbol = ",";
+
/**
* Name key for the "double" keyword.
*/
diff --git a/test/end-to-end/Enums/C#/Direction.cs b/test/end-to-end/Enums/C#/Direction.cs
new file mode 100644
index 00000000..7a6f3c1d
--- /dev/null
+++ b/test/end-to-end/Enums/C#/Direction.cs
@@ -0,0 +1,9 @@
+namespace Enums
+{
+ public enum Direction
+ {
+ Unknown = 0,
+ Horizontal = 1,
+ Vertical = 2
+ }
+}
diff --git a/test/end-to-end/Enums/C#/Main.cs b/test/end-to-end/Enums/C#/Main.cs
index 0f384386..0a5a177b 100644
--- a/test/end-to-end/Enums/C#/Main.cs
+++ b/test/end-to-end/Enums/C#/Main.cs
@@ -1,26 +1,36 @@
+using Enums;
using System;
namespace Enums
{
- enum Direction
- {
- Unknown = 0,
- Horizontal = 1,
- Vertical = 2
- }
class Program
{
+ private static void PrintValue(Direction direction)
+ {
+ if (direction == Direction.Horizontal)
+ {
+ Console.WriteLine("Horizontal.");
+ }
+ else if (direction == Direction.Vertical)
+ {
+ Console.WriteLine("Vertical.");
+ }
+ else
+ {
+ Console.WriteLine("Unknown...");
+ }
+ }
+
public static void Main()
{
- Console.WriteLine(string.Format("Unknown by lookup is {0}", Direction.Unknown));
- Console.WriteLine(string.Format("Horizontal by lookup is {0}", Direction.Horizontal));
- Console.WriteLine(string.Format("Vertical by lookup is {0}", Direction.Vertical));
+ Program.PrintValue(Direction.Unknown);
+ Program.PrintValue(Direction.Horizontal);
+ Program.PrintValue(Direction.Vertical);
Direction direction;
- Direction unknown = Direction.Unknown;
-
- Console.WriteLine(string.Format("unknown variable is {0}", unknown));
+ direction = Direction.Unknown;
+ Program.PrintValue(direction);
}
}
}
diff --git a/test/end-to-end/Enums/Gls/Direction.gls b/test/end-to-end/Enums/Gls/Direction.gls
new file mode 100644
index 00000000..2740371b
--- /dev/null
+++ b/test/end-to-end/Enums/Gls/Direction.gls
@@ -0,0 +1,7 @@
+file start : Enums Direction
+ enum start : export Direction
+ enum member : Unknown 0 ,
+ enum member : Horizontal 1 ,
+ enum member : Vertical 2
+ enum end
+file end
diff --git a/test/end-to-end/Enums/Gls/Main.gls b/test/end-to-end/Enums/Gls/Main.gls
index 31c7e6cc..e8aadd59 100644
--- a/test/end-to-end/Enums/Gls/Main.gls
+++ b/test/end-to-end/Enums/Gls/Main.gls
@@ -1,20 +1,25 @@
file start : Enums Main
- enum start : Direction
- enum member : Unknown 0 ,
- enum member : Horizontal 1 ,
- enum member : Vertical 2
- enum end
+ import local : Enums Direction use Direction
main context start
+ standalone function declare start : private PrintValue void direction Direction
+ if start : { operation : direction (equal to) { enum : Direction Horizontal } }
+ print : "Horizontal."
+ else if start : { operation : direction (equal to) { enum : Direction Vertical } }
+ print : "Vertical."
+ else start
+ print : "Unknown..."
+ if end
+ standalone function declare end
+
main start
- print : { string format : ("Unknown by lookup is {0}") { enum : Direction Unknown } int }
- print : { string format : ("Horizontal by lookup is {0}") { enum : Direction Horizontal } int }
- print : { string format : ("Vertical by lookup is {0}") { enum : Direction Vertical } int }
+ standalone function : private { main group } PrintValue { enum : Direction Unknown }
+ standalone function : private { main group } PrintValue { enum : Direction Horizontal }
+ standalone function : private { main group } PrintValue { enum : Direction Vertical }
variable : direction Direction
- variable : unknown Direction { enum : Direction Unknown }
-
- print : { string format : ("unknown variable is {0}") unknown int }
+ operation : direction equals { enum : Direction Unknown }
+ standalone function : private { main group } PrintValue direction
main end
main context end
file end
diff --git a/test/end-to-end/Enums/Java/Direction.java b/test/end-to-end/Enums/Java/Direction.java
new file mode 100644
index 00000000..d9ee4401
--- /dev/null
+++ b/test/end-to-end/Enums/Java/Direction.java
@@ -0,0 +1,7 @@
+package enums;
+
+enum Direction {
+ Unknown,
+ Horizontal,
+ Vertical
+}
diff --git a/test/end-to-end/Enums/Java/Main.java b/test/end-to-end/Enums/Java/Main.java
index 135fcf02..aac5b338 100644
--- a/test/end-to-end/Enums/Java/Main.java
+++ b/test/end-to-end/Enums/Java/Main.java
@@ -1,20 +1,25 @@
package enums;
-enum Direction {
- Unknown(0),
- Horizontal(1),
- Vertical(2)
-}
+import enums.Direction;
class Main {
+ private static void printValue(Direction direction) {
+ if (direction == Direction.Horizontal) {
+ System.out.println("Horizontal.");
+ } else if (direction == Direction.Vertical) {
+ System.out.println("Vertical.");
+ } else {
+ System.out.println("Unknown...");
+ }
+ }
+
public static void main(String[] args) {
- System.out.println(String.format("Unknown by lookup is %d", Direction.Unknown));
- System.out.println(String.format("Horizontal by lookup is %d", Direction.Horizontal));
- System.out.println(String.format("Vertical by lookup is %d", Direction.Vertical));
+ Main.printValue(Direction.Unknown);
+ Main.printValue(Direction.Horizontal);
+ Main.printValue(Direction.Vertical);
Direction direction;
- Direction unknown = Direction.Unknown;
-
- System.out.println(String.format("unknown variable is %d", unknown));
+ direction = Direction.Unknown;
+ Main.printValue(direction);
}
}
diff --git a/test/end-to-end/Enums/JavaScript/Direction.js b/test/end-to-end/Enums/JavaScript/Direction.js
new file mode 100644
index 00000000..97185e7d
--- /dev/null
+++ b/test/end-to-end/Enums/JavaScript/Direction.js
@@ -0,0 +1,5 @@
+const Direction = module.exports.Direction = {
+ Unknown: 0,
+ Horizontal: 1,
+ Vertical: 2
+};
diff --git a/test/end-to-end/Enums/JavaScript/index.js b/test/end-to-end/Enums/JavaScript/index.js
index fe9c3286..20f77834 100644
--- a/test/end-to-end/Enums/JavaScript/index.js
+++ b/test/end-to-end/Enums/JavaScript/index.js
@@ -1,14 +1,19 @@
-const Direction = {
- Unknown: 0,
- Horizontal: 1,
- Vertical: 2
-};
+const { Direction } = require("./Direction");
-console.log(`Unknown by lookup is ${Direction.Unknown}`);
-console.log(`Horizontal by lookup is ${Direction.Horizontal}`);
-console.log(`Vertical by lookup is ${Direction.Vertical}`);
+function printValue(direction) {
+ if (direction === Direction.Horizontal) {
+ console.log("Horizontal.");
+ } else if (direction === Direction.Vertical) {
+ console.log("Vertical.");
+ } else {
+ console.log("Unknown...");
+ }
+}
-let direction;
-let unknown = Direction.Unknown;
+printValue(Direction.Unknown);
+printValue(Direction.Horizontal);
+printValue(Direction.Vertical);
-console.log(`unknown variable is ${unknown}`);
+let direction;
+direction = Direction.Unknown;
+printValue(direction);
diff --git a/test/end-to-end/Enums/Python/direction.py b/test/end-to-end/Enums/Python/direction.py
new file mode 100644
index 00000000..08f35c61
--- /dev/null
+++ b/test/end-to-end/Enums/Python/direction.py
@@ -0,0 +1,5 @@
+from enum import Enum
+class Direction(Enum):
+ Unknown = 0
+ Horizontal = 1
+ Vertical = 2
diff --git a/test/end-to-end/Enums/Python/main.py b/test/end-to-end/Enums/Python/main.py
index a9b7ca4f..7f72223e 100644
--- a/test/end-to-end/Enums/Python/main.py
+++ b/test/end-to-end/Enums/Python/main.py
@@ -1,13 +1,17 @@
-class Direction(Enum):
- Unknown = 0
- Horizontal = 1
- Vertical = 2
+from direction import Direction
-if __name__ == "__main__":
- print("Unknown by lookup is {0}".format(Direction.Unknown))
- print("Horizontal by lookup is {0}".format(Direction.Horizontal))
- print("Vertical by lookup is {0}".format(Direction.Vertical))
+def print_value(direction):
+ if direction == Direction.Horizontal:
+ print("Horizontal.")
+ elif direction == Direction.Vertical:
+ print("Vertical.")
+ else:
+ print("Unknown...")
- unknown = Direction.Unknown
+if __name__ == "__main__":
+ print_value(Direction.Unknown)
+ print_value(Direction.Horizontal)
+ print_value(Direction.Vertical)
- print("unknown variable is {0}".format(unknown))
+ direction = Direction.Unknown
+ print_value(direction)
diff --git a/test/end-to-end/Enums/Ruby/direction.rb b/test/end-to-end/Enums/Ruby/direction.rb
new file mode 100644
index 00000000..24b6f680
--- /dev/null
+++ b/test/end-to-end/Enums/Ruby/direction.rb
@@ -0,0 +1,5 @@
+class Direction
+ Unknown = 0
+ Horizontal = 1
+ Vertical = 2
+end
diff --git a/test/end-to-end/Enums/Ruby/main.rb b/test/end-to-end/Enums/Ruby/main.rb
index 142deb81..8d701ab0 100644
--- a/test/end-to-end/Enums/Ruby/main.rb
+++ b/test/end-to-end/Enums/Ruby/main.rb
@@ -1,13 +1,18 @@
-class Direction
- Unknown = 0
- Horizontal = 1
- Vertical = 2
-end
+require_relative "./direction"
-puts "Unknown by lookup is %d" % [Direction::Unknown]
-puts "Horizontal by lookup is %d" % [Direction::Horizontal]
-puts "Vertical by lookup is %d" % [Direction::Vertical]
+def print_value(direction)
+ if direction == Direction::Horizontal
+ puts "Horizontal."
+ elsif direction == Direction::Vertical
+ puts "Vertical."
+ else
+ puts "Unknown..."
+ end
+end
-unknown = Direction::Unknown
+print_value(Direction::Unknown)
+print_value(Direction::Horizontal)
+print_value(Direction::Vertical)
-puts "unknown variable is %d" % [unknown]
+direction = Direction::Unknown
+print_value(direction)
diff --git a/test/end-to-end/Enums/TypeScript/Direction.ts b/test/end-to-end/Enums/TypeScript/Direction.ts
new file mode 100644
index 00000000..a5bccb5b
--- /dev/null
+++ b/test/end-to-end/Enums/TypeScript/Direction.ts
@@ -0,0 +1,5 @@
+export enum Direction {
+ Unknown = 0,
+ Horizontal = 1,
+ Vertical = 2
+}
diff --git a/test/end-to-end/Enums/TypeScript/index.ts b/test/end-to-end/Enums/TypeScript/index.ts
index 05164981..835bf4c5 100644
--- a/test/end-to-end/Enums/TypeScript/index.ts
+++ b/test/end-to-end/Enums/TypeScript/index.ts
@@ -1,14 +1,19 @@
-enum Direction {
- Unknown = 0,
- Horizontal = 1,
- Vertical = 2
+import { Direction } from "./Direction";
+
+function printValue(direction: Direction): void {
+ if (direction === Direction.Horizontal) {
+ console.log("Horizontal.");
+ } else if (direction === Direction.Vertical) {
+ console.log("Vertical.");
+ } else {
+ console.log("Unknown...");
+ }
}
-console.log(`Unknown by lookup is ${Direction.Unknown}`);
-console.log(`Horizontal by lookup is ${Direction.Horizontal}`);
-console.log(`Vertical by lookup is ${Direction.Vertical}`);
+printValue(Direction.Unknown);
+printValue(Direction.Horizontal);
+printValue(Direction.Vertical);
let direction: Direction;
-let unknown: Direction = Direction.Unknown;
-
-console.log(`unknown variable is ${unknown}`);
+direction = Direction.Unknown;
+printValue(direction);
diff --git a/test/end-to-end/Enums/output.txt b/test/end-to-end/Enums/output.txt
new file mode 100644
index 00000000..8e30becb
--- /dev/null
+++ b/test/end-to-end/Enums/output.txt
@@ -0,0 +1,4 @@
+Unknown...
+Horizontal.
+Vertical.
+Unknown...
diff --git a/test/integration/EnumEnd/enum end.py b/test/integration/EnumEnd/enum end.py
index 0d055518..323a2e93 100644
--- a/test/integration/EnumEnd/enum end.py
+++ b/test/integration/EnumEnd/enum end.py
@@ -1,3 +1,5 @@
#
+from enum import Enum
+
class Direction(Enum):
#
diff --git a/test/integration/EnumMember/enum member comma.java b/test/integration/EnumMember/enum member comma.java
index ed988d29..41e0f031 100644
--- a/test/integration/EnumMember/enum member comma.java
+++ b/test/integration/EnumMember/enum member comma.java
@@ -1,3 +1,3 @@
//
-Horizontal(1),
+Horizontal,
//
diff --git a/test/integration/EnumMember/enum member no comma.java b/test/integration/EnumMember/enum member no comma.java
index 86b2fb4d..28085fc9 100644
--- a/test/integration/EnumMember/enum member no comma.java
+++ b/test/integration/EnumMember/enum member no comma.java
@@ -1,3 +1,3 @@
//
-Horizontal(1)
+Horizontal
//
diff --git a/test/integration/EnumStart/enum start export.cs b/test/integration/EnumStart/enum start export.cs
new file mode 100644
index 00000000..480c9cba
--- /dev/null
+++ b/test/integration/EnumStart/enum start export.cs
@@ -0,0 +1,4 @@
+//
+public enum Direction
+{
+//
diff --git a/test/integration/EnumStart/enum start export.gls b/test/integration/EnumStart/enum start export.gls
new file mode 100644
index 00000000..77948e2a
--- /dev/null
+++ b/test/integration/EnumStart/enum start export.gls
@@ -0,0 +1,3 @@
+-
+enum start : export Direction
+-
diff --git a/test/integration/EnumStart/enum start export.java b/test/integration/EnumStart/enum start export.java
new file mode 100644
index 00000000..099d7749
--- /dev/null
+++ b/test/integration/EnumStart/enum start export.java
@@ -0,0 +1,3 @@
+//
+enum Direction {
+//
diff --git a/test/integration/EnumStart/enum start export.js b/test/integration/EnumStart/enum start export.js
new file mode 100644
index 00000000..0140fc60
--- /dev/null
+++ b/test/integration/EnumStart/enum start export.js
@@ -0,0 +1,3 @@
+//
+const Direction = module.exports.Direction = {
+//
diff --git a/test/integration/EnumStart/enum start export.py b/test/integration/EnumStart/enum start export.py
new file mode 100644
index 00000000..323a2e93
--- /dev/null
+++ b/test/integration/EnumStart/enum start export.py
@@ -0,0 +1,5 @@
+#
+from enum import Enum
+
+class Direction(Enum):
+#
diff --git a/test/integration/EnumStart/enum start export.rb b/test/integration/EnumStart/enum start export.rb
new file mode 100644
index 00000000..51c87627
--- /dev/null
+++ b/test/integration/EnumStart/enum start export.rb
@@ -0,0 +1,3 @@
+#
+class Direction
+#
diff --git a/test/integration/EnumStart/enum start export.ts b/test/integration/EnumStart/enum start export.ts
new file mode 100644
index 00000000..b4d29e8c
--- /dev/null
+++ b/test/integration/EnumStart/enum start export.ts
@@ -0,0 +1,3 @@
+//
+export enum Direction {
+//
diff --git a/test/integration/EnumStart/enum start.py b/test/integration/EnumStart/enum start.py
index 0d055518..323a2e93 100644
--- a/test/integration/EnumStart/enum start.py
+++ b/test/integration/EnumStart/enum start.py
@@ -1,3 +1,5 @@
#
+from enum import Enum
+
class Direction(Enum):
#