summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java65
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java4
3 files changed, 66 insertions, 4 deletions
diff --git a/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
index 0a87da0..7b343b7 100644
--- a/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
+++ b/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
@@ -272,7 +272,6 @@ public class Transient0Tests {
Decoder<T> decoder
) throws IOException {
var outputStream = new ByteArrayOutputStream();
- // TODO: should this use IdentityHashMap? Leave it up the caller?
encoder.encode(value, outputStream, new HashMap<>());
var bytes = outputStream.toByteArray();
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 05ce8f1..1e2c07c 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
@@ -73,15 +73,74 @@ public class JavaTransient0Generator implements Generator {
}
private void generateSupportTypes() throws IOException {
+ var typeId = JavaIdentifier.of("typeId");
+ var value = JavaIdentifier.of("value");
+ var other = JavaIdentifier.of("other");
+ var otherSharedValue = JavaIdentifier.of("otherSharedValue");
+
JavaGenerator.write(this.sourceRootDirectory, List.of(
new JavaCompilationUnit(new JavaRecordDeclaration(
this.taggedSharedValueRef(),
List.of(
- new JavaRecordComponent(JavaTypeRef.LONG, JavaIdentifier.of("typeId")),
- new JavaRecordComponent(JavaTypeRef.OBJECT, JavaIdentifier.of("value"))
+ new JavaRecordComponent(JavaTypeRef.LONG, typeId),
+ new JavaRecordComponent(JavaTypeRef.OBJECT, value)
),
List.of(),
- List.of(),
+ List.of(
+ new JavaMethodDeclaration(
+ JavaIdentifier.of("equals"),
+ JavaVisibility.PUBLIC,
+ JavaMemberKind.INSTANCE,
+ JavaTypeRef.BOOLEAN,
+ List.of(new JavaParam(JavaTypeRef.OBJECT, other)),
+ List.of(),
+ Optional.of(new JavaBlock(List.of(
+ new JavaReturn(new JavaBinaryOperation(
+ JavaBinaryOperator.LOGICAL_AND,
+ new JavaBinaryOperation(
+ JavaBinaryOperator.LOGICAL_AND,
+ new JavaInstanceofExpression(
+ new JavaRef(other),
+ new JavaPattern(taggedSharedValueRef(), otherSharedValue)
+ ),
+ new JavaBinaryOperation(
+ JavaBinaryOperator.EQUAL_TO,
+ new JavaFieldAccess(JavaRef.THIS, typeId),
+ new JavaFieldAccess(new JavaRef(otherSharedValue), typeId)
+ )
+ ),
+ new JavaBinaryOperation(
+ JavaBinaryOperator.EQUAL_TO,
+ new JavaFieldAccess(JavaRef.THIS, value),
+ new JavaFieldAccess(new JavaRef(otherSharedValue), value)
+ )
+ ))
+ )))
+ ),
+ new JavaMethodDeclaration(
+ JavaIdentifier.of("hashCode"),
+ JavaVisibility.PUBLIC,
+ JavaMemberKind.INSTANCE,
+ JavaTypeRef.INT,
+ List.of(),
+ List.of(),
+ Optional.of(new JavaBlock(List.of(
+ // TODO: implement directly
+ new JavaReturn(new JavaStaticMethodCall(
+ JavaTypeRef.OBJECTS,
+ JavaIdentifier.of("hash"),
+ List.of(
+ new JavaFieldAccess(JavaRef.THIS, typeId),
+ new JavaStaticMethodCall(
+ JavaTypeRef.SYSTEM,
+ JavaIdentifier.of("identityHashCode"),
+ List.of(new JavaFieldAccess(JavaRef.THIS, value))
+ )
+ )
+ ))
+ )))
+ )
+ ),
DocComment.EMPTY
))
));
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 677b9c6..ef2686a 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
@@ -104,6 +104,8 @@ public record JavaTypeRef(
public static final JavaTypeRef OBJECT = topLevel(JavaPackages.JAVA_LANG, JavaIdentifier.of("Object"));
+ public static final JavaTypeRef OBJECTS = topLevel(JavaPackages.JAVA_UTIL, JavaIdentifier.of("Objects"));
+
public static final JavaTypeRef OPTIONAL = topLevel(JavaPackages.JAVA_UTIL, JavaIdentifier.of("Optional"));
public static JavaTypeRef optional(JavaTypeRef elementType) {
@@ -122,4 +124,6 @@ public record JavaTypeRef(
public static final JavaTypeRef STANDARD_CHARSETS = topLevel(JavaPackages.JAVA_NIO_CHARSET, JavaIdentifier.of("StandardCharsets"));
public static final JavaTypeRef STREAM = topLevel(JavaPackages.JAVA_UTIL_STREAM, JavaIdentifier.of("Stream"));
+
+ public static final JavaTypeRef SYSTEM = topLevel(JavaPackages.JAVA_LANG, JavaIdentifier.of("System"));
}