diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-26 16:04:41 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-26 16:04:41 +0100 |
| commit | 7272bb92deb55a032ef37e6f3f8549793b1e2a3b (patch) | |
| tree | bc00660c6a7b0ecb3a8a39a4947cc5879a284ce5 /src/main | |
| parent | fadd0bd1e7eed3320dbcea67aa75a91ac5e62cca (diff) | |
Distinguish sum variant from untagged value in java-transient-0
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java | 51 |
1 files changed, 45 insertions, 6 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 f1d4957..7a27e52 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 @@ -16,9 +16,7 @@ import org.zwobble.json5.reader.Json5ObjectReader; import java.io.IOException; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -49,10 +47,12 @@ public class JavaTransient0Generator implements Generator { private final Path sourceRootDirectory; private final JavaGenerator javaGenerator; + private final Map<Type, Long> typeIds; public JavaTransient0Generator(Path sourceRootDirectory, JavaGenerator javaGenerator) { this.sourceRootDirectory = sourceRootDirectory; this.javaGenerator = javaGenerator; + this.typeIds = new HashMap<>(); } @Override @@ -62,6 +62,7 @@ public class JavaTransient0Generator implements Generator { ) throws IOException { var context = new Context(typesInfo); + generateSupportTypes(); generateBuiltins(); for (var namespace : namespaces) { @@ -71,6 +72,44 @@ public class JavaTransient0Generator implements Generator { } } + private void generateSupportTypes() throws IOException { + 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")) + ), + List.of(), + List.of(), + DocComment.EMPTY + )) + )); + } + + private JavaTypeRef taggedSharedValueRef() { + var packageName = this.javaGenerator.namespaceToJavaPackageName(NamespaceName.of()); + + return JavaTypeRef.topLevel( + packageName, + JavaIdentifier.of("HobgoblinTransient0TaggedSharedValue") + ); + } + + private JavaExpression taggedSharedValue(JavaExpression value, Type type) { + return new JavaNewExpression( + this.taggedSharedValueRef(), + List.of(new JavaIntegerLiteral(this.typeId(type)), value) + ); + } + + private long typeId(Type type) { + var typeId = this.typeIds + .computeIfAbsent(type, _ -> (long) this.typeIds.size()); + + return typeId; + } + private void generateBuiltins() throws IOException { var packageName = this.javaGenerator.namespaceToJavaPackageName(NamespaceName.of()); var transient0JavaName = generateTransient0ClassName("Builtins"); @@ -551,7 +590,7 @@ public class JavaTransient0Generator implements Generator { OUTPUT_STREAM_NAME ), new JavaParam( - JavaTypeRef.map(JavaTypeRef.OBJECT, JavaTypeRef.LONG_BOXED), + JavaTypeRef.map(this.taggedSharedValueRef(), JavaTypeRef.LONG_BOXED), SHARED_VALUES_NAME ) ), @@ -912,7 +951,7 @@ public class JavaTransient0Generator implements Generator { Optional.of(new JavaMethodCall( new JavaRef(SHARED_VALUES_NAME), JavaIdentifier.of("get"), - List.of(value) + List.of(taggedSharedValue(value, type)) )) ), new JavaIfStatement( @@ -938,7 +977,7 @@ public class JavaTransient0Generator implements Generator { new JavaRef(SHARED_VALUES_NAME), JavaIdentifier.of("put"), List.of( - value, + this.taggedSharedValue(value, type), new JavaCast(JavaTypeRef.LONG, new JavaMethodCall( new JavaRef(SHARED_VALUES_NAME), JavaIdentifier.of("size"), |
