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 +++++++++++++++++----- .../compiler/output/lang/java/JavaWriterTests.java | 21 +++++++++++----- 4 files changed, 47 insertions(+), 17 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 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"); 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 1bcc57f..abbbeea 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 @@ -101,8 +101,8 @@ public class JavaWriterTests { var java = new JavaInterfaceDeclaration( "Shape", List.of( - JavaTypeRef.ref(List.of("abc", "def"), "One"), - JavaTypeRef.ref(List.of("abc", "def"), "Two") + JavaTypeRef.topLevel(List.of("abc", "def"), "One"), + JavaTypeRef.topLevel(List.of("abc", "def"), "Two") ), DocComment.EMPTY ); @@ -294,7 +294,7 @@ public class JavaWriterTests { @Test public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException { - var java = JavaTypeRef.ref(List.of("abc", "def"), "One"); + var java = JavaTypeRef.topLevel(List.of("abc", "def"), "One"); var string = write(writer -> writer.writeTypeRef(java)); @@ -303,12 +303,12 @@ public class JavaWriterTests { @Test public void typeRefWithArgsHasAngleBrackets() throws IOException { - var java = JavaTypeRef.generic( + var java = JavaTypeRef.topLevelGeneric( List.of("abc", "def"), "One", List.of( - JavaTypeRef.ref(List.of(), "Two"), - JavaTypeRef.ref(List.of(), "Three") + JavaTypeRef.topLevel(List.of(), "Two"), + JavaTypeRef.topLevel(List.of(), "Three") ) ); @@ -317,6 +317,15 @@ public class JavaWriterTests { assertThat(string, equalTo("abc.def.One")); } + @Test + public void typeRefInnerTypeNameIsSeparatedByDot() throws IOException { + var java = JavaTypeRef.inner(List.of("abc", "def"), "One", "Two"); + + var string = write(writer -> writer.writeTypeRef(java)); + + assertThat(string, equalTo("abc.def.One.Two")); + } + private String write(Write write) throws IOException { var stringWriter = new StringWriter(); var javaWriter = new JavaWriter(new CodeWriter(stringWriter)); -- cgit v1.2.3