diff options
Diffstat (limited to 'src/main')
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); } |
