summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-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
4 files changed, 29 insertions, 9 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());
}