diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-26 16:35:56 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-26 16:35:56 +0100 |
| commit | fbc7b75f2b26958b12911dfd664ef4171426d85c (patch) | |
| tree | 1c60cf3263809c20f125d0e9e37e80ce2c1e023f /src | |
| parent | 7ce94ffa95effb49012f1b5a45e42e0c34ccf026 (diff) | |
Compare shared values by identity in java-transient-0
Diffstat (limited to 'src')
2 files changed, 66 insertions, 3 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 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")); } |
