From 802b9d14b7b0e400be53213d75e01ab858bf5a12 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 18 May 2026 18:55:04 +0100 Subject: Support JavaTypeRef to inner type --- .../generators/javatypes/JavaTypesGenerator.java | 8 +++--- .../compiler/output/lang/java/JavaWriter.java | 6 ++++- .../compiler/output/lang/java/ast/JavaTypeRef.java | 29 +++++++++++++++++----- 3 files changed, 32 insertions(+), 11 deletions(-) (limited to 'src/main') 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 packageName, String name, List args) { +public record JavaTypeRef(List packageName, List typeNames, List 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 packageName, String name) { - return new JavaTypeRef(packageName, name, List.of()); + public static JavaTypeRef topLevel(List packageName, String name) { + return new JavaTypeRef(packageName, List.of(name), List.of()); } - public static JavaTypeRef generic(List packageName, String name, List args) { - return new JavaTypeRef(packageName, name, args); + public static JavaTypeRef inner(List packageName, String... typeNames) { + return new JavaTypeRef(packageName, Arrays.asList(typeNames), List.of()); + } + + public static JavaTypeRef topLevelGeneric( + List packageName, + String name, + List args + ) { + return new JavaTypeRef(packageName, List.of(name), args); + } + + public static JavaTypeRef generic( + List packageName, + List typeNames, + List args + ) { + return new JavaTypeRef(packageName, typeNames, args); } public static final JavaTypeRef INT = primitive("int"); -- cgit v1.2.3