diff options
Diffstat (limited to 'src/main/java/org')
2 files changed, 94 insertions, 0 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 5feba05..59dcefe 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 @@ -433,6 +433,8 @@ public class JavaTransient0Generator implements Generator { case ConstructedNativeType constructedNativeType -> { if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateEncodeList(value, constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { + yield generateEncodeOption(value, constructedNativeType.args().getFirst()); } else { throw new UnsupportedOperationException("TODO"); } @@ -491,6 +493,8 @@ public class JavaTransient0Generator implements Generator { case ConstructedNativeType constructedNativeType -> { if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateDecodeList(target, constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { + yield generateDecodeOption(target, constructedNativeType.args().getFirst()); } else { throw new UnsupportedOperationException("TODO"); } @@ -633,6 +637,88 @@ public class JavaTransient0Generator implements Generator { return statements; } + private List<JavaBlockStatement> generateEncodeOption( + JavaExpression value, + Type elementType + ) { + var statements = new ArrayList<JavaBlockStatement>(); + var isPresent = new JavaMethodCall( + value, + JavaIdentifier.of("isPresent"), + List.of() + ); + + statements.addAll(generateEncode( + isPresent, + NativeTypes.BOOL + )); + + statements.add(new JavaIfStatement( + isPresent, + new JavaBlock(generateEncode( + new JavaMethodCall( + value, + JavaIdentifier.of("get"), + List.of() + ), + elementType + )), + new JavaBlock(List.of()) + )); + + return statements; + } + + private List<JavaBlockStatement> generateDecodeOption( + JavaIdentifier target, + Type elementType + ) { + var isPresent = JavaIdentifier.of(target.value() + "$isPresent"); + var element = JavaIdentifier.of(target.value() + "$element"); + + var statements = new ArrayList<JavaBlockStatement>(); + + statements.addAll(generateDecode(isPresent, NativeTypes.BOOL)); + + statements.add(new JavaLocalVariableDeclaration( + Optional.of(JavaTypeRef.optional(this.javaGenerator.generateReferenceTypeRef(elementType))), + target, + Optional.empty() + )); + + var ifTrue = new ArrayList<JavaBlockStatement>(); + + ifTrue.addAll(generateDecode(element, elementType)); + + ifTrue.add(new JavaExpressionStatement(new JavaBinaryOperation( + JavaBinaryOperator.ASSIGN, + new JavaRef(target), + new JavaStaticMethodCall( + JavaTypeRef.OPTIONAL, + JavaIdentifier.of("of"), + List.of(new JavaRef(element)) + ) + ))); + + statements.add(new JavaIfStatement( + new JavaRef(isPresent), + new JavaBlock(ifTrue), + new JavaBlock(List.of( + new JavaExpressionStatement(new JavaBinaryOperation( + JavaBinaryOperator.ASSIGN, + new JavaRef(target), + new JavaStaticMethodCall( + JavaTypeRef.OPTIONAL, + JavaIdentifier.of("empty"), + List.of() + ) + )) + )) + )); + + return statements; + } + private static JavaMethodCall generateOutputStreamWrite(JavaExpression byteToWrite) { return new JavaMethodCall( new JavaRef(OUTPUT_STREAM_NAME), diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java index 0975e4e..8dbca61 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java @@ -75,6 +75,14 @@ public record JavaTypeRef(JavaPackageName packageName, List<JavaIdentifier> type public static final JavaTypeRef OPTIONAL = topLevel(JavaPackages.JAVA_UTIL, JavaIdentifier.of("Optional")); + public static JavaTypeRef optional(JavaTypeRef elementType) { + return new JavaTypeRef( + OPTIONAL.packageName, + OPTIONAL.typeNames, + List.of(JavaTypeArg.invariant(elementType)) + ); + } + public static final JavaTypeRef OUTPUT_STREAM = topLevel(JavaPackages.JAVA_IO, JavaIdentifier.of("OutputStream")); public static final JavaTypeRef STANDARD_CHARSETS = topLevel(JavaPackages.JAVA_NIO_CHARSET, JavaIdentifier.of("StandardCharsets")); |
