summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java313
1 files changed, 169 insertions, 144 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 6352c49..f0fe329 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,45 +330,9 @@ public class JavaTransient0Generator implements Generator {
) {
return switch (statement) {
case TypedEnumDefinitionNode enumDefinition -> {
- var enumJavaTypeRef = this.javaGenerator.generateTypeRef(enumDefinition.type());
- var ordinal = JavaIdentifier.of("ordinal");
- var enumValues = JavaIdentifier.of(this.javaGenerator.generateTypeName(enumDefinition.type().name()).value() + "$values");
-
- yield Stream.of(
- generateEncodeMethod(
- enumDefinition.type(),
- new JavaBlock(generateEncode(
- new JavaMethodCall(
- new JavaRef(VALUE_NAME),
- ordinal,
- List.of()
- ),
- NativeTypes.INT_32
- ))
- ),
-
- new JavaFieldDeclaration(
- JavaVisibility.PRIVATE,
- JavaMemberKind.STATIC,
- JavaTypeRef.array(enumJavaTypeRef),
- enumValues,
- Optional.of(new JavaStaticMethodCall(
- enumJavaTypeRef,
- JavaIdentifier.of("values"),
- List.of()
- ))
- ),
-
- generateDecodeMethod(
- enumDefinition.type(),
- new JavaBlock(Stream.concat(
- generateDecode(ordinal, NativeTypes.INT_32).stream(),
- Stream.of(new JavaReturn(new JavaArrayAccess(
- new JavaRef(enumValues),
- new JavaRef(ordinal)
- )))
- ).toList())
- )
+ yield Stream.concat(
+ Stream.of(generateEncodeEnumMethod(enumDefinition)),
+ generateDecodeEnumMethod(enumDefinition)
);
}
@@ -377,133 +341,194 @@ public class JavaTransient0Generator implements Generator {
}
case TypedStructDefinitionNode structDefinition -> {
- var structJavaTypeRef = this.javaGenerator.generateTypeRef(structDefinition.type());
-
yield Stream.of(
- generateEncodeMethod(
- structDefinition.type(),
- new JavaBlock(
- structDefinition.fields().stream()
- .flatMap(field -> generateEncode(
- new JavaMethodCall(
- new JavaRef(VALUE_NAME),
- this.javaGenerator.generateFieldName(field.name()),
- List.of()
- ),
- field.type().value()
- ).stream())
- .toList()
- )
- ),
- generateDecodeMethod(
- structDefinition.type(),
- new JavaBlock(
- Stream.concat(
- structDefinition.fields().stream()
- .flatMap(field -> generateDecode(
- this.javaGenerator.generateFieldName(field.name()),
- field.type().value()
- ).stream()),
- Stream.of(new JavaReturn(new JavaNewExpression(
- structJavaTypeRef,
- structDefinition.fields().stream()
- .<JavaExpression>map(field -> new JavaRef(this.javaGenerator.generateFieldName(field.name())))
- .toList()
- )))
- ).toList()
- )
- )
+ generateEncodeStructMethod(structDefinition),
+ generateDecodeStructMethod(structDefinition)
);
}
case TypedSumDefinitionNode sumDefinition -> {
- var encodeStatements = List.<JavaBlockStatement>of(new JavaSwitchStatement(
+ yield Stream.of(
+ generateEncodeSumMethod(sumDefinition),
+ generateDecodeSumMethod(sumDefinition)
+ );
+ }
+ };
+ }
+
+ private JavaMethodDeclaration generateEncodeEnumMethod(TypedEnumDefinitionNode enumDefinition) {
+ return generateEncodeMethod(
+ enumDefinition.type(),
+ new JavaBlock(generateEncode(
+ new JavaMethodCall(
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<JavaBlockStatement>();
-
- 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()
- ));
+ JavaIdentifier.of("ordinal"),
+ List.of()
+ ),
+ NativeTypes.INT_32
+ ))
+ );
+ }
- var decodeStatements = new ArrayList<JavaBlockStatement>();
+ private Stream<JavaClassBodyDeclaration> generateDecodeEnumMethod(TypedEnumDefinitionNode enumDefinition) {
+ var enumJavaTypeRef = this.javaGenerator.generateTypeRef(enumDefinition.type());
+ var ordinal = JavaIdentifier.of("ordinal");
+ var enumValues = JavaIdentifier.of(this.javaGenerator.generateTypeName(enumDefinition.type().name()).value() + "$values");
+
+ return Stream.of(
+ new JavaFieldDeclaration(
+ JavaVisibility.PRIVATE,
+ JavaMemberKind.STATIC,
+ JavaTypeRef.array(enumJavaTypeRef),
+ enumValues,
+ Optional.of(new JavaStaticMethodCall(
+ enumJavaTypeRef,
+ JavaIdentifier.of("values"),
+ List.of()
+ ))
+ ),
- var variantTag = JavaIdentifier.of("variantTag");
+ generateDecodeMethod(
+ enumDefinition.type(),
+ new JavaBlock(Stream.concat(
+ generateDecode(ordinal, NativeTypes.INT_32).stream(),
+ Stream.of(new JavaReturn(new JavaArrayAccess(
+ new JavaRef(enumValues),
+ new JavaRef(ordinal)
+ )))
+ ).toList())
+ )
+ );
+ }
- decodeStatements.addAll(generateDecode(variantTag, NativeTypes.INT_32));
+ private JavaMethodDeclaration generateEncodeStructMethod(TypedStructDefinitionNode structDefinition) {
+ return generateEncodeMethod(
+ structDefinition.type(),
+ new JavaBlock(
+ structDefinition.fields().stream()
+ .flatMap(field -> generateEncode(
+ new JavaMethodCall(
+ new JavaRef(VALUE_NAME),
+ this.javaGenerator.generateFieldName(field.name()),
+ List.of()
+ ),
+ field.type().value()
+ ).stream())
+ .toList()
+ )
+ );
+ }
- var cases = new ArrayList<JavaSwitchRule>();
+ private JavaMethodDeclaration generateDecodeStructMethod(TypedStructDefinitionNode structDefinition) {
+ var structJavaTypeRef = this.javaGenerator.generateTypeRef(structDefinition.type());
- for (var variantIndex = 0; variantIndex < sumDefinition.variants().size(); variantIndex++) {
- var variantType = sumDefinition.variants().get(variantIndex).type().value();
+ return generateDecodeMethod(
+ structDefinition.type(),
+ new JavaBlock(
+ Stream.concat(
+ structDefinition.fields().stream()
+ .flatMap(field -> generateDecode(
+ this.javaGenerator.generateFieldName(field.name()),
+ field.type().value()
+ ).stream()),
+ Stream.of(new JavaReturn(new JavaNewExpression(
+ structJavaTypeRef,
+ structDefinition.fields().stream()
+ .<JavaExpression>map(field -> new JavaRef(this.javaGenerator.generateFieldName(field.name())))
+ .toList()
+ )))
+ ).toList()
+ )
+ );
+ }
+
+ private JavaMethodDeclaration generateEncodeSumMethod(TypedSumDefinitionNode sumDefinition) {
+ 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);
var statements = new ArrayList<JavaBlockStatement>();
- statements.addAll(generateDecode(variantVariable, variantType));
+ statements.addAll(generateEncode(
+ new JavaIntegerLiteral(variantIndex),
+ NativeTypes.INT_32
+ ));
- statements.add(new JavaReturn(new JavaRef(variantVariable)));
+ statements.addAll(generateEncode(
+ new JavaRef(variantVariable),
+ variant.type().value()
+ ));
- cases.add(new JavaSwitchRule(
- new JavaCaseConstant(new JavaIntegerLiteral(variantIndex)),
+ return new JavaSwitchRule(
+ new JavaCasePattern(
+ this.javaGenerator.generateTypeRef(variant.type().value()),
+ variantVariable
+ ),
new JavaBlock(statements)
- ));
- }
+ );
+ })
+ .toList()
+ ));
- cases.add(new JavaSwitchRule(
- new JavaCaseDefault(),
- new JavaBlock(List.of(
- new JavaThrowStatement(new JavaNewExpression(
- JavaTypeRef.RUNTIME_EXCEPTION,
- List.of(
- new JavaBinaryOperation(
- JavaBinaryOperator.ADD,
- new JavaStringLiteral("unexpected " + sumDefinition.type().describe() + " variant tag: "),
- new JavaRef(variantTag)
- )
- )
- ))
- ))
- ));
+ return generateEncodeMethod(
+ sumDefinition.type(),
+ new JavaBlock(encodeStatements)
+ );
+ }
- decodeStatements.add(new JavaSwitchStatement(
- new JavaRef(variantTag),
- cases
- ));
+ private JavaMethodDeclaration generateDecodeSumMethod(TypedSumDefinitionNode sumDefinition) {
+ var decodeStatements = new ArrayList<JavaBlockStatement>();
- yield Stream.of(
- generateEncodeMethod(
- sumDefinition.type(),
- new JavaBlock(encodeStatements)
- ),
- generateDecodeMethod(
- sumDefinition.type(),
- new JavaBlock(decodeStatements)
+ var variantTag = JavaIdentifier.of("variantTag");
+
+ decodeStatements.addAll(generateDecode(variantTag, NativeTypes.INT_32));
+
+ 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);
+
+ var statements = new ArrayList<JavaBlockStatement>();
+
+ statements.addAll(generateDecode(variantVariable, variantType));
+
+ 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(),
+ new JavaBlock(List.of(
+ new JavaThrowStatement(new JavaNewExpression(
+ JavaTypeRef.RUNTIME_EXCEPTION,
+ List.of(
+ new JavaBinaryOperation(
+ JavaBinaryOperator.ADD,
+ new JavaStringLiteral("unexpected " + sumDefinition.type().describe() + " variant tag: "),
+ new JavaRef(variantTag)
+ )
)
- );
- }
- };
+ ))
+ ))
+ ));
+
+ decodeStatements.add(new JavaSwitchStatement(
+ new JavaRef(variantTag),
+ cases
+ ));
+
+ return generateDecodeMethod(
+ sumDefinition.type(),
+ new JavaBlock(decodeStatements)
+ );
}
private JavaMethodDeclaration generateEncodeMethod(