summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-06-12 16:32:33 +0100
committerMichael Williamson <mike@zwobble.org>2026-06-12 16:32:33 +0100
commit1eeb7180140b4f6dad892010c1e60e03c2fa1bbe (patch)
tree1ad7f9397e0255630685938ad81b6fb948cdcdcb /src
parentf20705b9d152a1656c7496e18fb0d69942d597a5 (diff)
Add super type args
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeArg.java13
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java9
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java20
6 files changed, 49 insertions, 15 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java
index b304d5a..827e79e 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java
@@ -102,7 +102,7 @@ public class JavaPreciselyMatchersGenerator implements Generator {
JavaTypeRef.topLevelGeneric(
PRECISELY_PACKAGE_NAME,
"Matcher",
- List.of(JavaTypeRef.OBJECT)
+ List.of(JavaTypeArg.invariant(JavaTypeRef.OBJECT))
)
),
List.of(
@@ -210,7 +210,11 @@ public class JavaPreciselyMatchersGenerator implements Generator {
private static final JavaTypeRef MATCH_RESULT_REF = JavaTypeRef.topLevel(PRECISELY_PACKAGE_NAME, "MatchResult");
private static JavaTypeRef matcherRef(JavaTypeRef arg) {
- return JavaTypeRef.topLevelGeneric(PRECISELY_PACKAGE_NAME, "Matcher", List.of(arg));
+ return JavaTypeRef.topLevelGeneric(
+ PRECISELY_PACKAGE_NAME,
+ "Matcher",
+ List.of(JavaTypeArg.invariant(arg))
+ );
}
}
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 b195922..041f3d0 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
@@ -319,11 +319,11 @@ public class JavaTypesGenerator implements Generator {
constructedNativeType.constructor().genericType(),
context
);
- var argRefs = constructedNativeType.args().stream()
- .map(arg -> generateTypeRef(arg, context))
+ var javaArgs = constructedNativeType.args().stream()
+ .map(arg -> JavaTypeArg.invariant(generateTypeRef(arg, context)))
.toList();
// TODO: separate type for constructed types?
- yield JavaTypeRef.generic(innerTypeRef.packageName(), innerTypeRef.typeNames(), argRefs);
+ yield JavaTypeRef.generic(innerTypeRef.packageName(), innerTypeRef.typeNames(), javaArgs);
}
case SimpleNativeType simpleNativeType -> {
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 656636d..aec83da 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
@@ -406,6 +406,14 @@ public class JavaWriter implements AutoCloseable {
}
private static void writeTypeArg(JavaTypeArg arg, WriteString writer) throws IOException {
+ switch (arg.variance()) {
+ case INVARIANT -> {
+ // Do nothing.
+ }
+ case SUPER -> {
+ writer.write("? super ");
+ }
+ }
writeTypeRef(arg.type(), writer);
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeArg.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeArg.java
index 0d1b290..5c2a3e7 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeArg.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeArg.java
@@ -1,7 +1,16 @@
package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
-public record JavaTypeArg(JavaTypeRef type) {
+public record JavaTypeArg(Variance variance, JavaTypeRef type) {
+ public enum Variance {
+ INVARIANT,
+ SUPER
+ }
+
public static JavaTypeArg invariant(JavaTypeRef type) {
- return new JavaTypeArg(type);
+ return new JavaTypeArg(Variance.INVARIANT, type);
+ }
+
+ public static JavaTypeArg superType(JavaTypeRef type) {
+ return new JavaTypeArg(Variance.SUPER, type);
}
}
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 55b8546..9986768 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
@@ -19,19 +19,16 @@ public record JavaTypeRef(List<String> packageName, List<String> typeNames, List
public static JavaTypeRef topLevelGeneric(
List<String> packageName,
String name,
- List<JavaTypeRef> args
+ List<JavaTypeArg> args
) {
- return generic(packageName, List.of(name), args);
+ return new JavaTypeRef(packageName, List.of(name), args);
}
public static JavaTypeRef generic(
List<String> packageName,
List<String> typeNames,
- List<JavaTypeRef> argTypes
+ List<JavaTypeArg> args
) {
- var args = argTypes.stream()
- .map(arg -> JavaTypeArg.invariant(arg))
- .toList();
return new JavaTypeRef(packageName, typeNames, args);
}
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 0e24939..8ad22f9 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
@@ -764,8 +764,8 @@ public class JavaWriterTests {
List.of("abc", "def"),
"One",
List.of(
- JavaTypeRef.topLevel(List.of(), "Two"),
- JavaTypeRef.topLevel(List.of(), "Three")
+ JavaTypeArg.invariant(JavaTypeRef.topLevel(List.of(), "Two")),
+ JavaTypeArg.invariant(JavaTypeRef.topLevel(List.of(), "Three"))
)
);
@@ -775,6 +775,22 @@ public class JavaWriterTests {
}
@Test
+ public void typeRefArgCanBeSuper() throws IOException {
+ var java = JavaTypeRef.topLevelGeneric(
+ List.of("abc", "def"),
+ "One",
+ List.of(
+ JavaTypeArg.superType(JavaTypeRef.topLevel(List.of(), "Two")),
+ JavaTypeArg.superType(JavaTypeRef.topLevel(List.of(), "Three"))
+ )
+ );
+
+ var string = write(writer -> writer.writeTypeRef(java));
+
+ assertThat(string, equalTo("abc.def.One<? super Two, ? super Three>"));
+ }
+
+ @Test
public void typeRefInnerTypeNameIsSeparatedByDot() throws IOException {
var java = JavaTypeRef.inner(List.of("abc", "def"), "One", "Two");