summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java126
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/util/Lists.java18
2 files changed, 140 insertions, 4 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 a775773..ca654e3 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
@@ -11,6 +11,7 @@ import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*;
import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo;
import org.zwobble.hobgoblin.compiler.types.*;
import org.zwobble.hobgoblin.compiler.util.Casing;
+import org.zwobble.hobgoblin.compiler.util.Lists;
import org.zwobble.json5.reader.Json5ObjectReader;
import java.io.IOException;
@@ -550,7 +551,7 @@ public class JavaTransient0Generator implements Generator {
OUTPUT_STREAM_NAME
),
new JavaParam(
- JavaTypeRef.map(JavaTypeRef.STRING, JavaTypeRef.OBJECT),
+ JavaTypeRef.map(JavaTypeRef.OBJECT, JavaTypeRef.LONG_BOXED),
SHARED_VALUES_NAME
)
),
@@ -576,7 +577,7 @@ public class JavaTransient0Generator implements Generator {
INPUT_STREAM_NAME
),
new JavaParam(
- JavaTypeRef.map(JavaTypeRef.STRING, JavaTypeRef.OBJECT),
+ JavaTypeRef.list(JavaTypeRef.OBJECT),
SHARED_VALUES_NAME
)
),
@@ -586,12 +587,14 @@ public class JavaTransient0Generator implements Generator {
}
private List<JavaBlockStatement> generateEncode(JavaExpression value, Type type) {
- return switch (this.javaGenerator.collapseType(type)) {
+ return switch (type) {
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 if (constructedNativeType.constructor().equals(NativeTypes.SHARED)) {
+ yield generateEncodeShared(value, constructedNativeType.args().getFirst());
} else {
throw new UnsupportedOperationException("TODO");
}
@@ -658,12 +661,14 @@ public class JavaTransient0Generator implements Generator {
}
private List<JavaBlockStatement> generateDecode(JavaIdentifier target, Type type) {
- return switch (this.javaGenerator.collapseType(type)) {
+ return switch (type) {
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 if (constructedNativeType.constructor().equals(NativeTypes.SHARED)) {
+ yield generateDecodeShared(target, constructedNativeType.args().getFirst());
} else {
throw new UnsupportedOperationException("TODO");
}
@@ -893,6 +898,119 @@ public class JavaTransient0Generator implements Generator {
return statements;
}
+ private List<JavaBlockStatement> generateEncodeShared(
+ JavaExpression value,
+ Type type
+ ) {
+ var existingId = JavaIdentifier.of("existingId");
+
+ return List.of(
+ new JavaLocalVariableDeclaration(
+ Optional.empty(),
+ existingId,
+ Optional.of(new JavaMethodCall(
+ new JavaRef(SHARED_VALUES_NAME),
+ JavaIdentifier.of("get"),
+ List.of(value)
+ ))
+ ),
+ new JavaIfStatement(
+ new JavaBinaryOperation(
+ JavaBinaryOperator.NOT_EQUAL_TO,
+ new JavaRef(existingId),
+ new JavaNullLiteral()
+ ),
+ new JavaBlock(
+ generateEncode(new JavaRef(existingId), NativeTypes.INT_64)
+ ),
+ new JavaBlock(Lists.concat(List.of(
+ generateEncode(
+ new JavaMethodCall(
+ new JavaRef(SHARED_VALUES_NAME),
+ JavaIdentifier.of("size"),
+ List.of()
+ ),
+ NativeTypes.INT_64
+ ),
+ List.of(
+ new JavaExpressionStatement(new JavaMethodCall(
+ new JavaRef(SHARED_VALUES_NAME),
+ JavaIdentifier.of("put"),
+ List.of(
+ value,
+ new JavaCast(JavaTypeRef.LONG, new JavaMethodCall(
+ new JavaRef(SHARED_VALUES_NAME),
+ JavaIdentifier.of("size"),
+ List.of()
+ ))
+ )
+ ))
+ ),
+ generateEncode(value, type)
+ )))
+ )
+ );
+ }
+
+ private List<JavaBlockStatement> generateDecodeShared(
+ JavaIdentifier target,
+ Type type
+ ) {
+ var id = JavaIdentifier.of("id");
+ var decodedValue = JavaIdentifier.of("decodedValue");
+
+ return Lists.concat(List.of(
+ generateDecode(id, NativeTypes.INT_64),
+ List.of(
+ new JavaLocalVariableDeclaration(
+ Optional.of(this.javaGenerator.generateTypeRef(type)),
+ target,
+ Optional.empty()
+ ),
+ new JavaIfStatement(
+ new JavaBinaryOperation(
+ JavaBinaryOperator.LESS_THAN,
+ new JavaRef(id),
+ new JavaMethodCall(
+ new JavaRef(SHARED_VALUES_NAME),
+ JavaIdentifier.of("size"),
+ List.of()
+ )
+ ),
+ new JavaBlock(List.of(
+ new JavaExpressionStatement(new JavaBinaryOperation(
+ JavaBinaryOperator.ASSIGN,
+ new JavaRef(target),
+ new JavaCast(
+ this.javaGenerator.generateTypeRef(type),
+ new JavaMethodCall(
+ new JavaRef(SHARED_VALUES_NAME),
+ JavaIdentifier.of("get"),
+ List.of(new JavaCast(JavaTypeRef.INT, new JavaRef(id)))
+ )
+ )
+ ))
+ )),
+ new JavaBlock(Lists.concat(List.of(
+ generateDecode(decodedValue, type),
+ List.of(
+ new JavaExpressionStatement(new JavaMethodCall(
+ new JavaRef(SHARED_VALUES_NAME),
+ JavaIdentifier.of("add"),
+ List.of(new JavaRef(decodedValue))
+ )),
+ new JavaExpressionStatement(new JavaBinaryOperation(
+ JavaBinaryOperator.ASSIGN,
+ new JavaRef(target),
+ new JavaRef(decodedValue)
+ ))
+ )
+ )))
+ )
+ )
+ ));
+ }
+
private static JavaMethodCall generateOutputStreamWrite(JavaExpression byteToWrite) {
return new JavaMethodCall(
new JavaRef(OUTPUT_STREAM_NAME),
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/util/Lists.java b/src/main/java/org/zwobble/hobgoblin/compiler/util/Lists.java
new file mode 100644
index 0000000..31bbd42
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/util/Lists.java
@@ -0,0 +1,18 @@
+package org.zwobble.hobgoblin.compiler.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Lists {
+ private Lists() {}
+
+ public static <T> List<T> concat(List<List<T>> lists) {
+ var result = new ArrayList<T>();
+
+ for (var list : lists) {
+ result.addAll(list);
+ }
+
+ return result;
+ }
+}