summaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-02 13:27:21 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-02 13:27:21 +0100
commit75ccf6f44905cbc94b866821f34f340370430292 (patch)
tree94aa995fa1e2b33969b61290b0dc27baaa365da0 /src/main/java/org/zwobble
parent399aef569ddedcb58dcb394b394d55f20c78ee83 (diff)
Use variant tag field rather than using index
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java36
1 files changed, 20 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 9bb72a3..00f6b52 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
@@ -472,8 +472,8 @@ public class JavaTransient0Generator implements Generator {
case TypedSumDefinitionNode sumDefinition -> {
yield Stream.of(
- generateEncodeSumMethod(sumDefinition),
- generateDecodeSumMethod(sumDefinition)
+ generateEncodeSumMethod(sumDefinition, context.typesInfo),
+ generateDecodeSumMethod(sumDefinition, context.typesInfo)
);
}
};
@@ -569,29 +569,31 @@ public class JavaTransient0Generator implements Generator {
);
}
- private JavaMethodDeclaration generateEncodeSumMethod(TypedSumDefinitionNode sumDefinition) {
+ private JavaMethodDeclaration generateEncodeSumMethod(
+ TypedSumDefinitionNode sumDefinition,
+ TypesInfo typesInfo
+ ) {
var encodeStatements = List.<JavaBlockStatement>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);
+ typesInfo.sumVariants(sumDefinition.type()).stream()
+ .map(variant -> {
+ var variantVariable = JavaIdentifier.of(VALUE_NAME.value() + "$" + variant.tag());
var statements = new ArrayList<JavaBlockStatement>();
statements.addAll(generateEncode(
- new JavaIntegerLiteral(variantIndex),
+ new JavaIntegerLiteral(variant.tag()),
NativeTypes.INT_32
));
statements.addAll(generateEncode(
new JavaRef(variantVariable),
- variant.type().value()
+ variant.containerType()
));
return new JavaSwitchRule(
new JavaCasePattern(new JavaPattern(
- this.javaGenerator.generateTypeRef(variant.type().value()),
+ this.javaGenerator.generateTypeRef(variant.containerType()),
variantVariable
)),
new JavaBlock(statements)
@@ -606,7 +608,10 @@ public class JavaTransient0Generator implements Generator {
);
}
- private JavaMethodDeclaration generateDecodeSumMethod(TypedSumDefinitionNode sumDefinition) {
+ private JavaMethodDeclaration generateDecodeSumMethod(
+ TypedSumDefinitionNode sumDefinition,
+ TypesInfo typesInfo
+ ) {
var decodeStatements = new ArrayList<JavaBlockStatement>();
var variantTag = JavaIdentifier.of("variantTag");
@@ -615,18 +620,17 @@ public class JavaTransient0Generator implements Generator {
var cases = new ArrayList<JavaSwitchRule>();
- 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);
+ for (var variant : typesInfo.sumVariants(sumDefinition.type())) {
+ var variantVariable = JavaIdentifier.of(VALUE_NAME.value() + "$" + variant.tag());
var statements = new ArrayList<JavaBlockStatement>();
- statements.addAll(generateDecode(variantVariable, variantType));
+ statements.addAll(generateDecode(variantVariable, variant.containerType()));
statements.add(new JavaReturn(new JavaRef(variantVariable)));
cases.add(new JavaSwitchRule(
- new JavaCaseConstant(new JavaIntegerLiteral(variantIndex)),
+ new JavaCaseConstant(new JavaIntegerLiteral(variant.tag())),
new JavaBlock(statements)
));
}