summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-10 10:37:05 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-10 10:37:05 +0100
commit608e7b2be13c1f79c0ea3fc9b38fdf217507227b (patch)
tree2f9cfa2f6eeee50ef66f054dfa13033e69952023 /src/main/java/org
parentd049a89e2e5ff0b52519f37502dbf0c17cb9455f (diff)
Add basic support for generic structs in java-transient-0
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java86
2 files changed, 54 insertions, 34 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java
index 1bb256c..901171c 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java
@@ -201,7 +201,7 @@ public class JavaGenerator {
throw new UnsupportedOperationException("TODO");
case TypeParam typeParam ->
- throw new UnsupportedOperationException("TODO");
+ JavaTypeRef.local(this.generateTypeName(typeParam.name()));
};
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
index 62f24b6..270683d 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java
@@ -123,7 +123,17 @@ public class JavaTypesGenerator implements Generator {
TypedStructDefinitionNode structDefinition,
Context context
) {
- var javaTypeRef = generateTypeRef(structDefinition.typeOrThrow(), context);
+ var javaRawTypeRef = generateTypeRef(structDefinition.typeOrConstructor().unboundType(), context);
+
+ var javaTypeParams = switch (structDefinition.typeOrConstructor()) {
+ case TypeOrConstructor.Constructor<SimpleStructType> constructor ->
+ constructor.value().params().stream()
+ .map(param -> new JavaTypeParameter(this.javaGenerator.generateTypeName(param.name())))
+ .toList();
+
+ case TypeOrConstructor.Type<SimpleStructType> _ ->
+ List.<JavaTypeParameter>of();
+ };
var components = structDefinition.fields().orElse(List.of()).stream()
.map(field -> new JavaRecordComponent(
@@ -132,48 +142,58 @@ public class JavaTypesGenerator implements Generator {
))
.toList();
- var implementsTypes = context.variantOf(structDefinition.typeOrThrow()).stream()
- .map(sumType -> this.generateTypeRef(sumType, context))
- .toList();
-
- var builderJavaTypeRef = generateBuilderTypeRef(structDefinition.typeOrThrow());
+ // TODO: handle generic types
+ var implementsTypes = switch (structDefinition.typeOrConstructor()) {
+ case TypeOrConstructor.Constructor<SimpleStructType> _ ->
+ List.<JavaTypeRef>of();
- var arbitraryValueExpression = new JavaNewExpression(
- builderJavaTypeRef,
- structDefinition.fields().orElse(List.of()).stream()
- .map(field -> arbitraryValue(field.type(), context))
- .toList()
- );
+ case TypeOrConstructor.Type<SimpleStructType> type ->
+ context.variantOf(type.value()).stream()
+ .map(sumType -> this.generateTypeRef(sumType, context))
+ .toList();
+ };
var body = new ArrayList<JavaClassBodyDeclaration>();
if (structDefinition.fields().isEmpty()) {
- body.add(generateStructSingletonInstanceField(javaTypeRef));
- body.add(generateStructSingletonConstructor(javaTypeRef));
+ body.add(generateStructSingletonInstanceField(javaRawTypeRef));
+ body.add(generateStructSingletonConstructor(javaRawTypeRef));
}
- body.add(new JavaMethodDeclaration(
- ARBITRARY_METHOD_NAME,
- JavaVisibility.PUBLIC,
- JavaMemberKind.STATIC,
- builderJavaTypeRef,
- List.of(),
- List.of(),
- new JavaBlock(List.of(
- new JavaReturn(arbitraryValueExpression)
- ))
- ));
+ // TODO: handle generic types
+ if (structDefinition.typeOrConstructor() instanceof TypeOrConstructor.Type<SimpleStructType>) {
+ var builderJavaTypeRef = generateBuilderTypeRef(structDefinition.typeOrThrow());
- body.add(generateStructDefinitionBuilder(
- structDefinition,
- components,
- context
- ));
+ var arbitraryValueExpression = new JavaNewExpression(
+ builderJavaTypeRef,
+ structDefinition.fields().orElse(List.of()).stream()
+ .map(field -> arbitraryValue(field.type(), context))
+ .toList()
+ );
+
+ body.add(new JavaMethodDeclaration(
+ ARBITRARY_METHOD_NAME,
+ JavaVisibility.PUBLIC,
+ JavaMemberKind.STATIC,
+ builderJavaTypeRef,
+ List.of(),
+ List.of(),
+ new JavaBlock(List.of(
+ new JavaReturn(arbitraryValueExpression)
+ ))
+ ));
+
+ body.add(generateStructDefinitionBuilder(
+ structDefinition,
+ components,
+ context
+ ));
+ }
if (structDefinition.fields().isPresent()) {
return new JavaRecordDeclaration(
- javaTypeRef,
- List.of(),
+ javaRawTypeRef,
+ javaTypeParams,
components,
implementsTypes,
body,
@@ -181,7 +201,7 @@ public class JavaTypesGenerator implements Generator {
);
} else {
return new JavaClassDeclaration(
- javaTypeRef,
+ javaRawTypeRef,
implementsTypes,
body,
structDefinition.docComment()