summaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-11 15:47:22 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-11 15:47:22 +0100
commitf9fe80fa50e6ac0c3121c0dde6420c79973c4ccc (patch)
tree77009b5272acfa7cbfc999bc023fad9970f1404e /src/main/java/org/zwobble
parentc80835cf60e3d772152fd1873dde76d41fa6cec2 (diff)
Support options in Java transient-0
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java86
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java8
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"));