summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-08 10:06:34 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-08 10:06:34 +0100
commit73eaea82c0bfb5a97f2eca9ffb44f86dbed6473c (patch)
treec009c2e909ece61a0bf9f52302c7591c7c482078
parent640a04f1c18f221e144d8ebbd177da005daec107 (diff)
Support List in java-types
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java4
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java18
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java12
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java4
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java29
5 files changed, 56 insertions, 11 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java
index 3ff1dce..fd6f8cd 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java
@@ -9,8 +9,10 @@ import java.util.List;
public class NativeTypes {
public static SimpleNativeType INT_32 = new SimpleNativeType("Int32");
+ public static final SimpleNativeType LIST_INNER = new SimpleNativeType("List");
+
public static TypeConstructor<SimpleNativeType> LIST = new TypeConstructor<>(
List.of(new TypeParam("T")),
- new SimpleNativeType("List")
+ LIST_INNER
);
}
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 50ee664..3e12b8c 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
@@ -133,22 +133,30 @@ public class JavaTypesGenerator implements Generator {
private JavaTypeRef generateTypeRef(Type type) {
return switch (type) {
- case ConstructedNativeType constructedNativeType ->
- throw new UnsupportedOperationException("TODO");
+ case ConstructedNativeType constructedNativeType -> {
+ var innerTypeRef = generateTypeRef(constructedNativeType.constructor().genericType());
+ var argRefs = constructedNativeType.args().stream()
+ .map(arg -> generateTypeRef(arg))
+ .toList();
+ // TODO: separate type for constructed types?
+ yield new JavaTypeRef(innerTypeRef.packageName(), innerTypeRef.name(), argRefs);
+ }
case SimpleNativeType simpleNativeType -> {
if (type.equals(NativeTypes.INT_32)) {
- yield new JavaTypeRef(List.of(), "int");
+ yield new JavaTypeRef(List.of(), "int", List.of());
+ } else if (type.equals(NativeTypes.LIST_INNER)) {
+ yield new JavaTypeRef(List.of("java", "util"), "List", List.of());
} else {
throw new UnsupportedOperationException("TODO");
}
}
case StructType structType ->
- new JavaTypeRef(namespaceToJavaPackageParts(structType.namespaceName()), structType.name());
+ new JavaTypeRef(namespaceToJavaPackageParts(structType.namespaceName()), structType.name(), List.of());
case SumType sumType ->
- new JavaTypeRef(namespaceToJavaPackageParts(sumType.namespaceName()), sumType.name());
+ new JavaTypeRef(namespaceToJavaPackageParts(sumType.namespaceName()), sumType.name(), List.of());
case TypeLevelValueType typeLevelValueType ->
throw new UnsupportedOperationException("TODO");
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java
index 4ce02b6..c866ecd 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java
@@ -135,13 +135,23 @@ public class JavaWriter implements AutoCloseable {
this.writer.write("}");
}
- private void writeTypeRef(JavaTypeRef type) throws IOException {
+ void writeTypeRef(JavaTypeRef type) throws IOException {
for (var part : type.packageName()) {
writer.write(part);
writer.write(".");
}
writer.write(type.name());
+
+ if (!type.args().isEmpty()) {
+ writer.write("<");
+ writeWithSeparator(
+ type.args(),
+ this::writeTypeRef,
+ () -> writer.write(", ")
+ );
+ writer.write(">");
+ }
}
private <T> void writeWithSeparator(
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 9ea840d..3654acc 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
@@ -2,6 +2,6 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
import java.util.List;
-public record JavaTypeRef(List<String> packageName, String name) {
- public static final JavaTypeRef VOID = new JavaTypeRef(List.of(), "void");
+public record JavaTypeRef(List<String> packageName, String name, List<JavaTypeRef> args) {
+ public static final JavaTypeRef VOID = new JavaTypeRef(List.of(), "void", List.of());
}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java
index da0f26f..0f2313a 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java
@@ -79,8 +79,8 @@ public class JavaWriterTests {
var java = new JavaInterfaceDeclaration(
"Shape",
List.of(
- new JavaTypeRef(List.of("abc", "def"), "One"),
- new JavaTypeRef(List.of("abc", "def"), "Two")
+ new JavaTypeRef(List.of("abc", "def"), "One", List.of()),
+ new JavaTypeRef(List.of("abc", "def"), "Two", List.of())
)
);
@@ -92,6 +92,31 @@ public class JavaWriterTests {
));
}
+ @Test
+ public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException {
+ var java = new JavaTypeRef(List.of("abc", "def"), "One", List.of());
+
+ var string = write(writer -> writer.writeTypeRef(java));
+
+ assertThat(string, equalTo("abc.def.One"));
+ }
+
+ @Test
+ public void typeRefWithArgsHasAngleBrackets() throws IOException {
+ var java = new JavaTypeRef(
+ List.of("abc", "def"),
+ "One",
+ List.of(
+ new JavaTypeRef(List.of(), "Two", List.of()),
+ new JavaTypeRef(List.of(), "Three", List.of())
+ )
+ );
+
+ var string = write(writer -> writer.writeTypeRef(java));
+
+ assertThat(string, equalTo("abc.def.One<Two, Three>"));
+ }
+
private String write(Write write) throws IOException {
var stringWriter = new StringWriter();
var javaWriter = new JavaWriter(new CodeWriter(stringWriter));