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): #