diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-06-12 16:32:33 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-06-12 16:32:33 +0100 |
| commit | 1eeb7180140b4f6dad892010c1e60e03c2fa1bbe (patch) | |
| tree | 1ad7f9397e0255630685938ad81b6fb948cdcdcb /src | |
| parent | f20705b9d152a1656c7496e18fb0d69942d597a5 (diff) | |
Add super type args
Diffstat (limited to 'src')
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"); |
