From f4bccfa54ba5158d00f866d4265a04cb049f7dbd Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 19 Jun 2026 18:30:28 +0100 Subject: Generate Java types for enum --- examples/07-enum/hobgoblin.json5 | 9 +++++ examples/07-enum/output/java/.gitignore | 2 + examples/07-enum/output/java/pom.xml | 47 ++++++++++++++++++++++ .../src/main/java/org/zwobble/example/Main.java | 9 +++++ examples/07-enum/src/numbers.hob | 6 +++ .../generators/javatypes/JavaTypesGenerator.java | 23 ++++++++++- 6 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 examples/07-enum/hobgoblin.json5 create mode 100644 examples/07-enum/output/java/.gitignore create mode 100644 examples/07-enum/output/java/pom.xml create mode 100644 examples/07-enum/output/java/src/main/java/org/zwobble/example/Main.java create mode 100644 examples/07-enum/src/numbers.hob diff --git a/examples/07-enum/hobgoblin.json5 b/examples/07-enum/hobgoblin.json5 new file mode 100644 index 0000000..1ec9568 --- /dev/null +++ b/examples/07-enum/hobgoblin.json5 @@ -0,0 +1,9 @@ +{ + outputs: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + packageName: "org.zwobble.example.types" + }, + ], +} diff --git a/examples/07-enum/output/java/.gitignore b/examples/07-enum/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/07-enum/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/07-enum/output/java/pom.xml b/examples/07-enum/output/java/pom.xml new file mode 100644 index 0000000..506947e --- /dev/null +++ b/examples/07-enum/output/java/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + org.zwobble.hobgoblin.examples + example + 1.0-SNAPSHOT + + + UTF-8 + 25 + 25 + + + + + org.zwobble.precisely + precisely + 0.1.5 + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.6.1 + + + add-source + generate-sources + + add-source + + + + src/gen/java + + + + + + + + diff --git a/examples/07-enum/output/java/src/main/java/org/zwobble/example/Main.java b/examples/07-enum/output/java/src/main/java/org/zwobble/example/Main.java new file mode 100644 index 0000000..022cef1 --- /dev/null +++ b/examples/07-enum/output/java/src/main/java/org/zwobble/example/Main.java @@ -0,0 +1,9 @@ +package org.zwobble.example; + +import org.zwobble.example.types.numbers.SmallNumber; + +public class Main { + public static void main() { + SmallNumber smallNumber = SmallNumber.one; + } +} diff --git a/examples/07-enum/src/numbers.hob b/examples/07-enum/src/numbers.hob new file mode 100644 index 0000000..125082d --- /dev/null +++ b/examples/07-enum/src/numbers.hob @@ -0,0 +1,6 @@ +/// A small number. +enum SmallNumber { + variant zero; + variant one; + variant two; +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index a0f92ce..4001b01 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java @@ -65,8 +65,13 @@ public class JavaTypesGenerator implements Generator { for (var statement : namespace.body()) { switch (statement) { - case TypedEnumDefinitionNode enumDefinitionNode -> { - throw new UnsupportedOperationException("TODO"); + case TypedEnumDefinitionNode enumDefinition -> { + var javaCompilationUnit = new JavaCompilationUnit( + packageParts, + generateEnumDefinition(enumDefinition, context) + ); + + javaCompilationUnits.add(javaCompilationUnit); } case TypedNativeTypeDefinitionNode nativeTypeDefinition -> { @@ -95,6 +100,20 @@ public class JavaTypesGenerator implements Generator { return javaCompilationUnits; } + private JavaTypeDeclaration generateEnumDefinition( + TypedEnumDefinitionNode enumDefinition, + Context context + ) { + return new JavaEnumDeclaration( + enumDefinition.name(), + enumDefinition.variants().stream() + .map(variant -> new JavaEnumConstant(variant.name())) + .toList(), + JavaCustomArea.forType(generateTypeRef(enumDefinition.type(), context), "body"), + enumDefinition.docComment() + ); + } + private JavaRecordDeclaration generateStructDefinition( TypedStructDefinitionNode structDefinition, Context context -- cgit v1.2.3