summaryrefslogtreecommitdiff
path: root/src/main
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/main
parentf20705b9d152a1656c7496e18fb0d69942d597a5 (diff)
Add super type args
Diffstat (limited to 'src/main')
-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
5 files changed, 31 insertions, 13 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);
}