summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-18 18:55:04 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-18 18:55:04 +0100
commit802b9d14b7b0e400be53213d75e01ab858bf5a12 (patch)
treec134f405b27a81ee7e4a2bb173a1ef3a30f40d0e /src/main
parent5bf65e7bb33956e07bdf5b6075646512941d7a25 (diff)
Support JavaTypeRef to inner type
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java29
3 files changed, 32 insertions, 11 deletions
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 df23aa2..82ef0cd 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
@@ -160,7 +160,7 @@ public class JavaTypesGenerator implements Generator {
.map(arg -> generateTypeRef(arg))
.toList();
// TODO: separate type for constructed types?
- yield JavaTypeRef.generic(innerTypeRef.packageName(), innerTypeRef.name(), argRefs);
+ yield JavaTypeRef.generic(innerTypeRef.packageName(), innerTypeRef.typeNames(), argRefs);
}
case SimpleNativeType simpleNativeType -> {
@@ -169,17 +169,17 @@ public class JavaTypesGenerator implements Generator {
} else if (type.equals(NativeTypes.STRING)) {
yield JavaTypeRef.STRING;
} else if (type.equals(NativeTypes.LIST_INNER)) {
- yield JavaTypeRef.ref(List.of("java", "util"), "List");
+ yield JavaTypeRef.topLevel(List.of("java", "util"), "List");
} else {
throw new UnsupportedOperationException("TODO");
}
}
case StructType structType ->
- JavaTypeRef.ref(namespaceToJavaPackageParts(structType.namespaceName()), structType.name());
+ JavaTypeRef.topLevel(namespaceToJavaPackageParts(structType.namespaceName()), structType.name());
case SumType sumType ->
- JavaTypeRef.ref(namespaceToJavaPackageParts(sumType.namespaceName()), sumType.name());
+ JavaTypeRef.topLevel(namespaceToJavaPackageParts(sumType.namespaceName()), sumType.name());
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 0d25a0e..1252777 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
@@ -225,7 +225,11 @@ public class JavaWriter implements AutoCloseable {
writer.write(".");
}
- writer.write(type.name());
+ writeWithSeparator(
+ type.typeNames(),
+ writer::write,
+ () -> writer.write(".")
+ );
if (!type.args().isEmpty()) {
writer.write("<");
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 88450ca..8fcac28 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
@@ -1,18 +1,35 @@
package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
+import java.util.Arrays;
import java.util.List;
-public record JavaTypeRef(List<String> packageName, String name, List<JavaTypeRef> args) {
+public record JavaTypeRef(List<String> packageName, List<String> typeNames, List<JavaTypeRef> args) {
private static JavaTypeRef primitive(String name) {
- return new JavaTypeRef(List.of(), name, List.of());
+ return new JavaTypeRef(List.of(), List.of(name), List.of());
}
- public static JavaTypeRef ref(List<String> packageName, String name) {
- return new JavaTypeRef(packageName, name, List.of());
+ public static JavaTypeRef topLevel(List<String> packageName, String name) {
+ return new JavaTypeRef(packageName, List.of(name), List.of());
}
- public static JavaTypeRef generic(List<String> packageName, String name, List<JavaTypeRef> args) {
- return new JavaTypeRef(packageName, name, args);
+ public static JavaTypeRef inner(List<String> packageName, String... typeNames) {
+ return new JavaTypeRef(packageName, Arrays.asList(typeNames), List.of());
+ }
+
+ public static JavaTypeRef topLevelGeneric(
+ List<String> packageName,
+ String name,
+ List<JavaTypeRef> args
+ ) {
+ return new JavaTypeRef(packageName, List.of(name), args);
+ }
+
+ public static JavaTypeRef generic(
+ List<String> packageName,
+ List<String> typeNames,
+ List<JavaTypeRef> args
+ ) {
+ return new JavaTypeRef(packageName, typeNames, args);
}
public static final JavaTypeRef INT = primitive("int");