summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java22
-rw-r--r--examples/10-transient-0/src/data.hob6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java42
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 <T> void assertRoundTripEncoding(
T value,
Encoder<T> 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 -> {