diff options
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<String> packageName, String name, List<JavaTypeRef> args) { +public record JavaTypeRef(List<String> packageName, List<String> typeNames, List<JavaTypeRef> 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<String> packageName, String name) { - return new JavaTypeRef(packageName, name, List.of()); + public static JavaTypeRef topLevel(List<String> packageName, String name) { + return new JavaTypeRef(packageName, List.of(name), List.of()); } - public static JavaTypeRef generic(List<String> packageName, String name, List<JavaTypeRef> args) { - return new JavaTypeRef(packageName, name, args); + public static JavaTypeRef inner(List<String> packageName, String... typeNames) { + return new JavaTypeRef(packageName, Arrays.asList(typeNames), List.of()); + } + + public static JavaTypeRef topLevelGeneric( + List<String> packageName, + String name, + List<JavaTypeRef> args + ) { + return new JavaTypeRef(packageName, List.of(name), args); + } + + public static JavaTypeRef generic( + List<String> packageName, + List<String> typeNames, + List<JavaTypeRef> 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<Two, Three>")); } + @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)); |
