From ecebc9cbb2bec79abecc068eb5ca740bd36fd0fc Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 13 Jul 2026 20:44:01 +0100 Subject: Support array types in JavaTypeRef --- .../compiler/output/lang/java/JavaWriter.java | 4 +++ .../compiler/output/lang/java/ast/JavaTypeRef.java | 37 +++++++++++++++++----- .../compiler/output/lang/java/JavaWriterTests.java | 24 ++++++++++++++ 3 files changed, 57 insertions(+), 8 deletions(-) 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 d1b0ccc..297bd27 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 @@ -361,6 +361,10 @@ public class JavaWriter implements AutoCloseable { ); writer.write(">"); } + + for (var dimensionIndex = 0; dimensionIndex < type.arrayDimensions(); dimensionIndex++) { + writer.write("[]"); + } } private static void writeTypeArg(JavaTypeArg arg, WriteString writer) throws IOException { 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 81e0acc..a50ed6e 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 @@ -3,17 +3,27 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; import java.util.Arrays; import java.util.List; -public record JavaTypeRef(JavaPackageName packageName, List typeNames, List args) { +public record JavaTypeRef( + JavaPackageName packageName, + List typeNames, + List args, + int arrayDimensions +) { private static JavaTypeRef primitive(String name) { - return new JavaTypeRef(JavaPackageName.EMPTY, List.of(JavaIdentifier.of(name)), List.of()); + return new JavaTypeRef( + JavaPackageName.EMPTY, + List.of(JavaIdentifier.of(name)), + List.of(), + 0 + ); } public static JavaTypeRef topLevel(JavaPackageName packageName, JavaIdentifier name) { - return new JavaTypeRef(packageName, List.of(name), List.of()); + return new JavaTypeRef(packageName, List.of(name), List.of(), 0); } public static JavaTypeRef inner(JavaPackageName packageName, JavaIdentifier... typeNames) { - return new JavaTypeRef(packageName, Arrays.asList(typeNames), List.of()); + return new JavaTypeRef(packageName, Arrays.asList(typeNames), List.of(), 0); } public static JavaTypeRef topLevelGeneric( @@ -21,7 +31,7 @@ public record JavaTypeRef(JavaPackageName packageName, List type JavaIdentifier name, List args ) { - return new JavaTypeRef(packageName, List.of(name), args); + return new JavaTypeRef(packageName, List.of(name), args, 0); } public static JavaTypeRef generic( @@ -29,7 +39,7 @@ public record JavaTypeRef(JavaPackageName packageName, List type List typeNames, List args ) { - return new JavaTypeRef(packageName, typeNames, args); + return new JavaTypeRef(packageName, typeNames, args, 0); } private static class JavaPackages { @@ -49,6 +59,15 @@ public record JavaTypeRef(JavaPackageName packageName, List type public static final JavaTypeRef STRING = primitive("String"); public static final JavaTypeRef VOID = primitive("void"); + public static JavaTypeRef array(JavaTypeRef elementType) { + return new JavaTypeRef( + elementType.packageName, + elementType.typeNames, + elementType.args, + elementType.arrayDimensions + 1 + ); + } + public static JavaTypeRef arrayList(JavaTypeRef elementType) { return JavaTypeRef.generic( JavaPackages.JAVA_UTIL, @@ -67,7 +86,8 @@ public record JavaTypeRef(JavaPackageName packageName, List type return new JavaTypeRef( LIST.packageName, LIST.typeNames, - List.of(JavaTypeArg.invariant(elementType)) + List.of(JavaTypeArg.invariant(elementType)), + 0 ); } @@ -79,7 +99,8 @@ public record JavaTypeRef(JavaPackageName packageName, List type return new JavaTypeRef( OPTIONAL.packageName, OPTIONAL.typeNames, - List.of(JavaTypeArg.invariant(elementType)) + List.of(JavaTypeArg.invariant(elementType)), + 0 ); } 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 9f6214d..79e8aa9 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 @@ -818,6 +818,30 @@ public class JavaWriterTests { assertThat(string, equalTo("abc.def.One.Two")); } + @Test + public void typeRefForArrayUsesSquareBrackets() throws IOException { + var java = JavaTypeRef.array(JavaTypeRef.topLevel( + JavaPackageName.of("abc", "def"), + JavaIdentifier.of("One") + )); + + var string = write(writer -> writer.writeTypeRef(java)); + + assertThat(string, equalTo("abc.def.One[]")); + } + + @Test + public void typeRefForMultiDimensionalArrayUsesMultipleSquareBrackets() throws IOException { + var java = JavaTypeRef.array(JavaTypeRef.array(JavaTypeRef.array(JavaTypeRef.topLevel( + JavaPackageName.of("abc", "def"), + JavaIdentifier.of("One") + )))); + + var string = write(writer -> writer.writeTypeRef(java)); + + assertThat(string, equalTo("abc.def.One[][][]")); + } + // == Visibility == // == Statements == -- cgit v1.2.3