From ed2fc42b45faa1392342ca7c62e4ad580091bf60 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 12 Jul 2026 11:20:44 +0100 Subject: Support sum types in Java transient-0 --- .../javatransient0/JavaTransient0Generator.java | 82 +++++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) (limited to 'src') 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 be04982..0c7d62d 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 @@ -406,7 +406,75 @@ public class JavaTransient0Generator implements Generator { } case TypedSumDefinitionNode sumDefinition -> { - yield Stream.of(); + var encodeStatements = List.of(new JavaSwitchStatement( + new JavaRef(VALUE_NAME), + IntStream.range(0, sumDefinition.variants().size()) + .mapToObj(variantIndex -> { + var variant = sumDefinition.variants().get(variantIndex); + var variantVariable = JavaIdentifier.of(VALUE_NAME.value() + "$" + variantIndex); + + var statements = new ArrayList(); + + statements.addAll(generateEncode( + new JavaIntegerLiteral(variantIndex), + NativeTypes.INT_32 + )); + + statements.addAll(generateEncode( + new JavaRef(variantVariable), + variant.type().value() + )); + + return new JavaSwitchRule( + new JavaCasePattern( + this.javaGenerator.generateTypeRef(variant.type().value()), + variantVariable + ), + new JavaBlock(statements) + ); + }) + .toList() + )); + + var decodeStatements = new ArrayList(); + + var variantTag = JavaIdentifier.of("variantTag"); + + decodeStatements.addAll(generateDecode(variantTag, NativeTypes.INT_32)); + + decodeStatements.add(new JavaSwitchStatement( + new JavaRef(variantTag), + IntStream.range(0, sumDefinition.variants().size()) + .mapToObj(variantIndex -> { + var variantType = sumDefinition.variants().get(variantIndex).type().value(); + var variantVariable = JavaIdentifier.of(VALUE_NAME.value() + "$" + variantIndex); + + var statements = new ArrayList(); + + statements.addAll(generateDecode(variantVariable, variantType)); + + statements.add(new JavaReturn(new JavaRef(variantVariable))); + + return new JavaSwitchRule( + new JavaCaseConstant(new JavaIntegerLiteral(variantIndex)), + new JavaBlock(statements) + ); + }).toList() + )); + + // TODO: handle this more elegantly + decodeStatements.add(new JavaReturn(new JavaNullLiteral())); + + yield Stream.of( + generateEncodeMethod( + sumDefinition.type(), + new JavaBlock(encodeStatements) + ), + generateDecodeMethod( + sumDefinition.type(), + new JavaBlock(decodeStatements) + ) + ); } }; } @@ -493,7 +561,11 @@ public class JavaTransient0Generator implements Generator { } case SumType sumType -> { - throw new UnsupportedOperationException("TODO"); + yield List.of(generateEncode( + value, + sumType.namespaceName(), + sumType + )); } case TypeLevelValueType typeLevelValueType -> { @@ -557,7 +629,11 @@ public class JavaTransient0Generator implements Generator { } case SumType sumType -> { - throw new UnsupportedOperationException("TODO"); + yield List.of(generateDecode( + target, + sumType.namespaceName(), + sumType + )); } case TypeLevelValueType typeLevelValueType -> { -- cgit v1.2.3