summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-12 17:54:29 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-12 17:54:29 +0100
commit018de952c5ac9f7caa6876628131f09e1d13ba2a (patch)
tree186be894948ff6b1466c9bb9a3ad12c400e1a545 /src/main/java/org
parent6c5333324ad0cf5453aea55062ff6676e5161a76 (diff)
Generate default case when decoding sum type
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java38
1 files changed, 22 insertions, 16 deletions
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 5565ca6..ac38727 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
@@ -442,28 +442,34 @@ public class JavaTransient0Generator implements Generator {
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 cases = new ArrayList<JavaSwitchRule>();
- var statements = new ArrayList<JavaBlockStatement>();
+ for (var variantIndex = 0; variantIndex < sumDefinition.variants().size(); variantIndex++) {
+ var variantType = sumDefinition.variants().get(variantIndex).type().value();
+ var variantVariable = JavaIdentifier.of(VALUE_NAME.value() + "$" + variantIndex);
- statements.addAll(generateDecode(variantVariable, variantType));
+ var statements = new ArrayList<JavaBlockStatement>();
- statements.add(new JavaReturn(new JavaRef(variantVariable)));
+ statements.addAll(generateDecode(variantVariable, variantType));
- return new JavaSwitchRule(
- new JavaCaseConstant(new JavaIntegerLiteral(variantIndex)),
- new JavaBlock(statements)
- );
- }).toList()
+ statements.add(new JavaReturn(new JavaRef(variantVariable)));
+
+ cases.add(new JavaSwitchRule(
+ new JavaCaseConstant(new JavaIntegerLiteral(variantIndex)),
+ new JavaBlock(statements)
+ ));
+ }
+
+ cases.add(new JavaSwitchRule(
+ new JavaCaseDefault(),
+ // TODO: throw an exception
+ new JavaBlock(List.of(new JavaReturn(new JavaNullLiteral())))
));
- // TODO: handle this more elegantly
- decodeStatements.add(new JavaReturn(new JavaNullLiteral()));
+ decodeStatements.add(new JavaSwitchStatement(
+ new JavaRef(variantTag),
+ cases
+ ));
yield Stream.of(
generateEncodeMethod(