From 018de952c5ac9f7caa6876628131f09e1d13ba2a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 12 Jul 2026 17:54:29 +0100 Subject: Generate default case when decoding sum type --- .../javatransient0/JavaTransient0Generator.java | 38 +++++++++++++--------- 1 file changed, 22 insertions(+), 16 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 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(); - var statements = new ArrayList(); + 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(); - 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( -- cgit v1.2.3