diff options
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java | 313 |
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( |
