summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java29
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java21
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));