From 10317b0c2841591a85530a5c4c38cac0c4bf5fe8 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 11 Jul 2026 16:43:48 +0100 Subject: Support enums in Java transient-0 --- .../java/org/zwobble/example/Transient0Tests.java | 22 ++++++++++++ examples/10-transient-0/src/data.hob | 6 ++++ .../javatransient0/JavaTransient0Generator.java | 42 ++++++++++++++++++++-- 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java index cb3ac61..7d6f7de 100644 --- a/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java +++ b/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.zwobble.example.types.data.EnumWithVariants; import org.zwobble.example.types.data.HobgoblinTransient0Data; import org.zwobble.example.types.data.InnerStruct; import org.zwobble.example.types.data.OuterStruct; @@ -121,6 +122,27 @@ public class Transient0Tests { ); } + @Test + public void enumWithVariants() throws IOException { + assertRoundTripEncoding( + EnumWithVariants.ZERO, + HobgoblinTransient0Data::encodeEnumWithVariants, + HobgoblinTransient0Data::decodeEnumWithVariants + ); + + assertRoundTripEncoding( + EnumWithVariants.ONE, + HobgoblinTransient0Data::encodeEnumWithVariants, + HobgoblinTransient0Data::decodeEnumWithVariants + ); + + assertRoundTripEncoding( + EnumWithVariants.TWO, + HobgoblinTransient0Data::encodeEnumWithVariants, + HobgoblinTransient0Data::decodeEnumWithVariants + ); + } + private void assertRoundTripEncoding( T value, Encoder encoder, diff --git a/examples/10-transient-0/src/data.hob b/examples/10-transient-0/src/data.hob index 80ba8e5..f6fa20e 100644 --- a/examples/10-transient-0/src/data.hob +++ b/examples/10-transient-0/src/data.hob @@ -37,3 +37,9 @@ struct StructWithOption { field a: Option[Int64]; field b: Option[InnerStruct]; } + +enum EnumWithVariants { + variant zero; + variant one; + variant two; +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java index 59dcefe..be04982 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java @@ -330,7 +330,35 @@ public class JavaTransient0Generator implements Generator { ) { return switch (statement) { case TypedEnumDefinitionNode enumDefinition -> { - yield Stream.of(); + var ordinal = JavaIdentifier.of("ordinal"); + yield Stream.of( + generateEncodeMethod( + enumDefinition.type(), + new JavaBlock(generateEncode( + new JavaMethodCall( + new JavaRef(VALUE_NAME), + ordinal, + List.of() + ), + NativeTypes.INT_32 + )) + ), + generateDecodeMethod( + enumDefinition.type(), + new JavaBlock(Stream.concat( + generateDecode(ordinal, NativeTypes.INT_32).stream(), + Stream.of(new JavaReturn(new JavaArrayAccess( + // TODO: avoid duplicating array each time + new JavaStaticMethodCall( + this.javaGenerator.generateTypeRef(enumDefinition.type()), + JavaIdentifier.of("values"), + List.of() + ), + new JavaRef(ordinal) + ))) + ).toList()) + ) + ); } case TypedNativeTypeDefinitionNode nativeTypeDefinition -> { @@ -441,7 +469,11 @@ public class JavaTransient0Generator implements Generator { } case EnumType enumType -> { - throw new UnsupportedOperationException("TODO"); + yield List.of(generateEncode( + value, + enumType.namespaceName(), + enumType + )); } case SimpleNativeType simpleNativeType -> { @@ -501,7 +533,11 @@ public class JavaTransient0Generator implements Generator { } case EnumType enumType -> { - throw new UnsupportedOperationException("TODO"); + yield List.of(generateDecode( + target, + enumType.namespaceName(), + enumType + )); } case SimpleNativeType simpleNativeType -> { -- cgit v1.2.3