summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-08 21:35:17 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-08 21:35:17 +0100
commit9cacda725dcfe5bf30cbb98ee56b04cce055d709 (patch)
treee1413305ec6438df2082f1787661d686f3338077
parent9e1dbfa5181d5785f1932bf773216c14e8d7c5ef (diff)
Add type parameters to Java interface declaration
-rw-r--r--hobgoblin/src/output/lang/java/ast.hob7
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java15
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java38
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameter.java36
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java24
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclarationMatcher.java6
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameterMatcher.java41
8 files changed, 159 insertions, 10 deletions
diff --git a/hobgoblin/src/output/lang/java/ast.hob b/hobgoblin/src/output/lang/java/ast.hob
index 69b4382..1d74315 100644
--- a/hobgoblin/src/output/lang/java/ast.hob
+++ b/hobgoblin/src/output/lang/java/ast.hob
@@ -37,6 +37,7 @@ struct JavaEnumConstant {
struct JavaInterfaceDeclaration {
field type: JavaTypeRef;
field openness: JavaInterfaceOpenness;
+ field typeParameters: List[JavaTypeParameter];
field permitsTypes: List[JavaTypeRef];
field body: List[JavaClassBodyDeclaration];
field docComment: DocComment;
@@ -114,6 +115,12 @@ struct JavaParam {
native JavaTypeRef {
}
+// == Type parameters ==
+
+struct JavaTypeParameter {
+ field name: JavaIdentifier;
+}
+
// == Visibility ==
enum JavaVisibility {
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 cd311d9..33072d7 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
@@ -477,6 +477,7 @@ public class JavaTypesGenerator implements Generator {
return new JavaInterfaceDeclaration(
generateTypeRef(sumDefinition.type(), context),
JavaInterfaceOpenness.SEALED,
+ List.of(),
sumDefinition.variants().stream()
.map(variant -> generateTypeRef(variant.type(), context))
.toList(),
@@ -493,6 +494,7 @@ public class JavaTypesGenerator implements Generator {
generateBuilderTypeRef(sumDefinition.type()),
JavaInterfaceOpenness.OPEN,
List.of(),
+ List.of(),
List.of(
new JavaMethodDeclaration(
BUILD_METHOD_NAME,
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 60998aa..3d57b82 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
@@ -149,6 +149,21 @@ public class JavaWriter implements AutoCloseable {
}
this.writer.write("interface ");
this.writeIdentifier(interfaceDeclaration.name());
+
+ if (!interfaceDeclaration.typeParameters().isEmpty()) {
+ this.writer.write("<");
+ writeWithSeparator(
+ interfaceDeclaration.typeParameters(),
+ typeParameter -> {
+ this.writeIdentifier(typeParameter.name());
+ },
+ () -> {
+ this.writer.write(", ");
+ }
+ );
+ this.writer.write(">");
+ }
+
this.writer.write(" ");
if (!interfaceDeclaration.permitsTypes().isEmpty()) {
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java
index 8feec8e..867ae84 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclaration.java
@@ -8,61 +8,79 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
public record JavaInterfaceDeclaration(
org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef type,
org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness openness,
+ java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter> typeParameters,
java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> permitsTypes,
java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration> body,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment
) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration {
public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder arbitrary() {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.HobgoblinNativeAst.arbitraryJavaTypeRef(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness.OPEN, java.util.List.of(), java.util.List.of(), org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment());
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.HobgoblinNativeAst.arbitraryJavaTypeRef(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness.OPEN, java.util.List.of(), java.util.List.of(), java.util.List.of(), org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment());
}
public record Builder(
org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef type,
org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness openness,
+ java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter> typeParameters,
java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> permitsTypes,
java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration> body,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment
) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeDeclaration.Builder, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration.Builder {
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration build() {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withType(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef type) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withOpenness(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceOpenness openness) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withTypeParameters(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter> typeParameters) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addTypeParameter(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter typeParameter) {
+ var typeParameters = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter>(this.typeParameters);
+ typeParameters.add(typeParameter);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addTypeParameter(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder typeParameter) {
+ var typeParameters = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter>(this.typeParameters);
+ typeParameters.add(typeParameter.build());
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withPermitsTypes(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> permitsTypes) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addPermitsType(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef permitsType) {
var permitsTypes = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef>(this.permitsTypes);
permitsTypes.add(permitsType);
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withBody(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration> body) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addBodyElement(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration bodyElement) {
var body = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration>(this.body);
body.add(bodyElement);
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder addBodyElement(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration.Builder bodyElement) {
var body = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration>(this.body);
body.add(bodyElement.build());
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) {
- return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, permitsTypes, body, docComment);
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder(type, openness, typeParameters, permitsTypes, body, docComment);
}
// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration.Builder body
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameter.java
new file mode 100644
index 0000000..bb6af43
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameter.java
@@ -0,0 +1,36 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter imports
+
+public record JavaTypeParameter(
+ org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name
+) {
+ public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier.arbitrary().build());
+ }
+
+ public record Builder(
+ org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name
+ ) {
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter build() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter(name);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder(name);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier.Builder name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder(name.build());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter body
+}
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 269b490..7158062 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
@@ -244,6 +244,7 @@ public class JavaWriterTests {
JavaInterfaceOpenness.OPEN,
List.of(),
List.of(),
+ List.of(),
DocComment.EMPTY
);
@@ -264,6 +265,7 @@ public class JavaWriterTests {
JavaInterfaceOpenness.SEALED,
List.of(),
List.of(),
+ List.of(),
DocComment.EMPTY
);
@@ -278,10 +280,30 @@ public class JavaWriterTests {
}
@Test
+ public void sealedInterfaceDeclarationWithTypeParameters() throws IOException {
+ var java = JavaInterfaceDeclaration.arbitrary()
+ .withType(JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("X")))
+ .withOpenness(JavaInterfaceOpenness.OPEN)
+ .addTypeParameter(JavaTypeParameter.arbitrary().withName(JavaIdentifier.of("T1")))
+ .addTypeParameter(JavaTypeParameter.arbitrary().withName(JavaIdentifier.of("T2")))
+ .build();
+
+ var string = write(writer -> writer.writeTypeDeclaration(java));
+
+ assertThat(string, equalTo("""
+ public interface X<T1, T2> {
+ // Custom area start: X body
+ // Custom area end: X body
+ }"""
+ ));
+ }
+
+ @Test
public void sealedInterfaceDeclarationWithPermitsTypes() throws IOException {
var java = new JavaInterfaceDeclaration(
JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Shape")),
JavaInterfaceOpenness.SEALED,
+ List.of(),
List.of(
JavaTypeRef.topLevel(JavaPackageName.of("abc", "def"), JavaIdentifier.of("One")),
JavaTypeRef.topLevel(JavaPackageName.of("abc", "def"), JavaIdentifier.of("Two"))
@@ -307,6 +329,7 @@ public class JavaWriterTests {
JavaInterfaceOpenness.OPEN,
List.of(),
List.of(),
+ List.of(),
new DocComment("A 2D shape.")
);
@@ -327,6 +350,7 @@ public class JavaWriterTests {
JavaTypeRef.topLevel(JavaPackageName.EMPTY, JavaIdentifier.of("Shape")),
JavaInterfaceOpenness.OPEN,
List.of(),
+ List.of(),
List.of(
JavaMethodDeclaration.arbitrary()
.withName(JavaIdentifier.of("a"))
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclarationMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclarationMatcher.java
index e8c039b..046489a 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclarationMatcher.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaInterfaceDeclarationMatcher.java
@@ -42,6 +42,12 @@ public final class JavaInterfaceDeclarationMatcher implements org.zwobble.precis
return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclarationMatcher(submatchers);
}
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclarationMatcher withTypeParameters(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter>> typeParameters) {
+ var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration>>(this.submatchers);
+ submatchers.add(org.zwobble.precisely.Matchers.has("typeParameters", org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration::typeParameters, typeParameters));
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclarationMatcher(submatchers);
+ }
+
public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclarationMatcher withPermitsTypes(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef>> permitsTypes) {
var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration>>(this.submatchers);
submatchers.add(org.zwobble.precisely.Matchers.has("permitsTypes", org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaInterfaceDeclaration::permitsTypes, permitsTypes));
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameterMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameterMatcher.java
new file mode 100644
index 0000000..031dc63
--- /dev/null
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeParameterMatcher.java
@@ -0,0 +1,41 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.java.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameterMatcher imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameterMatcher imports
+
+public final class JavaTypeParameterMatcher implements org.zwobble.precisely.Matcher<java.lang.Object> {
+ public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameterMatcher isJavaTypeParameter() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameterMatcher(java.util.List.of());
+ }
+
+ private final java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter>> submatchers;
+
+ private JavaTypeParameterMatcher(
+ java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter>> submatchers
+ ) {
+ this.submatchers = submatchers;
+ }
+
+ public org.zwobble.precisely.MatchResult match(java.lang.Object actual) {
+ return this.toMatcher().match(actual);
+ }
+
+ public org.zwobble.precisely.TextTree describe() {
+ return this.toMatcher().describe();
+ }
+
+ private org.zwobble.precisely.Matcher<java.lang.Object> toMatcher() {
+ return org.zwobble.precisely.Matchers.instanceOf(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter.class, this.submatchers);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameterMatcher withName(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier> name) {
+ var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter>>(this.submatchers);
+ submatchers.add(org.zwobble.precisely.Matchers.has("name", org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter::name, name));
+ return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameterMatcher(submatchers);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameterMatcher body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameterMatcher body
+}