diff options
Diffstat (limited to 'src/main/java/org')
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()); } |
