diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-08-10 10:47:26 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-08-10 10:47:26 +0100 |
| commit | 4b8dd80f18ae1e4bad0c61d55de685d69dfdbe1c (patch) | |
| tree | e9987bd8145872c75714ad0fd43ac74b5176144f | |
| parent | 608e7b2be13c1f79c0ea3fc9b38fdf217507227b (diff) | |
Add type parameters to Java method declarations
8 files changed, 92 insertions, 15 deletions
diff --git a/hobgoblin/src/output/lang/java/ast.hob b/hobgoblin/src/output/lang/java/ast.hob index a732b67..a63793e 100644 --- a/hobgoblin/src/output/lang/java/ast.hob +++ b/hobgoblin/src/output/lang/java/ast.hob @@ -93,6 +93,7 @@ struct JavaMethodDeclaration { field name: JavaIdentifier; field visibility: JavaVisibility; field kind: JavaMemberKind; + field typeParameters: List[JavaTypeParameter]; field returnType: JavaTypeRef; field params: List[JavaParam]; field throws: List[JavaTypeRef]; 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 dfded67..10b85f4 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,6 +102,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { this.javaGenerator.generateFieldName("is" + lowerCamelCaseToUpperCamelCase(structDefinition.name())), JavaVisibility.PUBLIC, JavaMemberKind.STATIC, + List.of(), javaMatcherTypeRef, List.of(), List.of(), @@ -144,6 +145,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { JavaIdentifier.of("match"), JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), MATCH_RESULT_REF, List.of(new JavaParam(JavaTypeRef.OBJECT, JavaIdentifier.of("actual"))), List.of(), @@ -161,6 +163,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { JavaIdentifier.of("describe"), JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), TEXT_TREE_REF, List.of(), List.of(), @@ -178,6 +181,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { JavaIdentifier.of("toMatcher"), JavaVisibility.PRIVATE, JavaMemberKind.INSTANCE, + List.of(), genericMatcherRef(JavaTypeRef.OBJECT), List.of(), List.of(), @@ -203,6 +207,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { this.javaGenerator.generateFieldName("with" + lowerCamelCaseToUpperCamelCase(field.name())), JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), javaMatcherTypeRef, List.of( new JavaParam(genericMatcherRef(JavaTypeArg.superType(javaFieldTypeRef)), javaFieldName) diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java index 4dab4da..4f4f0b9 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java @@ -102,6 +102,7 @@ public class JavaTransient0Generator implements Generator { JavaIdentifier.of("equals"), JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), JavaTypeRef.BOOLEAN, List.of(new JavaParam(JavaTypeRef.OBJECT, other)), List.of(), @@ -179,6 +180,7 @@ public class JavaTransient0Generator implements Generator { JavaIdentifier.of("encode"), JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), JavaTypeRef.VOID, generateEncodeParams(JavaTypeRef.local(JavaIdentifier.of("T"))), List.of(JavaTypeRef.IO_EXCEPTION), @@ -219,6 +221,7 @@ public class JavaTransient0Generator implements Generator { JavaIdentifier.of("decode"), JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), JavaTypeRef.local(JavaIdentifier.of("T")), generateDecodeParams(), List.of(JavaTypeRef.IO_EXCEPTION), @@ -802,6 +805,7 @@ public class JavaTransient0Generator implements Generator { encodeMethodName(type), JavaVisibility.PUBLIC, JavaMemberKind.STATIC, + List.of(), JavaTypeRef.VOID, generateEncodeParams(javaTypeRef), List.of(JavaTypeRef.IO_EXCEPTION), @@ -823,6 +827,7 @@ public class JavaTransient0Generator implements Generator { decodeMethodName(type), JavaVisibility.PUBLIC, JavaMemberKind.STATIC, + List.of(), javaTypeRef, generateDecodeParams(), List.of(JavaTypeRef.IO_EXCEPTION), @@ -919,6 +924,7 @@ public class JavaTransient0Generator implements Generator { generateEncodeConstructedTypeMethodName(constructedTypeIndex), JavaVisibility.PRIVATE, JavaMemberKind.STATIC, + List.of(), JavaTypeRef.VOID, generateEncodeParams(this.javaGenerator.generateTypeRef(constructedType)), List.of(JavaTypeRef.IO_EXCEPTION), @@ -1040,6 +1046,7 @@ public class JavaTransient0Generator implements Generator { generateDecodeConstructedTypeMethodName(constructedTypeIndex), JavaVisibility.PRIVATE, JavaMemberKind.STATIC, + List.of(), this.javaGenerator.generateTypeRef(constructedType), generateDecodeParams(), List.of(JavaTypeRef.IO_EXCEPTION), @@ -1452,6 +1459,7 @@ public class JavaTransient0Generator implements Generator { JavaIdentifier.of("hashCode"), JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), JavaTypeRef.INT, List.of(), List.of(), 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 270683d..6d1e4a8 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 @@ -175,6 +175,7 @@ public class JavaTypesGenerator implements Generator { ARBITRARY_METHOD_NAME, JavaVisibility.PUBLIC, JavaMemberKind.STATIC, + List.of(), builderJavaTypeRef, List.of(), List.of(), @@ -249,6 +250,7 @@ public class JavaTypesGenerator implements Generator { BUILD_METHOD_NAME, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), generateTypeRef(structType, context), List.of(), List.of(), @@ -295,6 +297,7 @@ public class JavaTypesGenerator implements Generator { withMethodName, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), builderJavaTypeRef, List.of( new JavaParam(generateTypeRef(fieldType, context), javaFieldName) @@ -315,6 +318,7 @@ public class JavaTypesGenerator implements Generator { withMethodName, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), builderJavaTypeRef, List.of( new JavaParam(fieldBuilderTypeRef.get(), javaFieldName) @@ -354,6 +358,7 @@ public class JavaTypesGenerator implements Generator { addElementMethodName, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), builderJavaTypeRef, List.of( new JavaParam(javaElementUnboxedType, javaElementName) @@ -387,6 +392,7 @@ public class JavaTypesGenerator implements Generator { addElementMethodName, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), builderJavaTypeRef, List.of( new JavaParam(elementBuilderTypeRef.get(), javaElementName) @@ -426,6 +432,7 @@ public class JavaTypesGenerator implements Generator { withMethodName, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), builderJavaTypeRef, List.of( new JavaParam(javaElementType, javaFieldName) @@ -456,6 +463,7 @@ public class JavaTypesGenerator implements Generator { withMethodName, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), builderJavaTypeRef, List.of( new JavaParam(elementBuilderTypeRef.get(), javaFieldName) @@ -496,6 +504,7 @@ public class JavaTypesGenerator implements Generator { generateFieldName(field.name()), JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), generateTypeRef(field.type().value(), context), List.of(), List.of(), @@ -529,6 +538,7 @@ public class JavaTypesGenerator implements Generator { BUILD_METHOD_NAME, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, + List.of(), generateTypeRef(sumDefinition.type(), context), List.of(), List.of(), 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 721cd14..74c7a2b 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 @@ -345,6 +345,11 @@ public class JavaWriter implements AutoCloseable { } } + if (!method.typeParameters().isEmpty()) { + this.writeTypeParameters(method.typeParameters()); + this.writer.write(" "); + } + writeTypeRef(method.returnType()); this.writer.write(" "); this.writeIdentifier(method.name()); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java index df614c9..c1658c0 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java @@ -5,88 +5,108 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration imports // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration imports +import java.util.List; + public record JavaMethodDeclaration( org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaVisibility visibility, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMemberKind kind, + java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter> typeParameters, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef returnType, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam> params, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> throws_, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock> body ) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration { public static org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder arbitrary() { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaVisibility.PUBLIC, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMemberKind.STATIC, org.zwobble.hobgoblin.compiler.output.lang.java.ast.HobgoblinNativeAst.arbitraryJavaTypeRef(), java.util.List.of(), java.util.List.of(), java.util.Optional.empty()); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaVisibility.PUBLIC, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMemberKind.STATIC, java.util.List.of(), org.zwobble.hobgoblin.compiler.output.lang.java.ast.HobgoblinNativeAst.arbitraryJavaTypeRef(), java.util.List.of(), java.util.List.of(), java.util.Optional.empty()); } public record Builder( org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaVisibility visibility, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMemberKind kind, + java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeParameter> typeParameters, org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef returnType, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam> params, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> throws_, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock> body ) implements org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaClassBodyDeclaration.Builder { public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration build() { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier name) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaIdentifier.Builder name) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name.build(), visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name.build(), visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withVisibility(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaVisibility visibility) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withKind(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMemberKind kind) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.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.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.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.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.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.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withReturnType(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef returnType) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withParams(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam> params) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam param) { var params = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam>(this.params); params.add(param); - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam.Builder param) { var params = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaParam>(this.params); params.add(param.build()); - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withThrows(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> throws_) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder addThrow(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef throw_) { var throws_ = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef>(this.throws_); throws_.add(throw_); - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withBody(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock> body) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, body); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, body); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock body) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, java.util.Optional.of(body)); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, java.util.Optional.of(body)); } public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock.Builder body) { - return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, throws_, java.util.Optional.of(body.build())); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, typeParameters, returnType, params, throws_, java.util.Optional.of(body.build())); } // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder body @@ -98,6 +118,7 @@ public record JavaMethodDeclaration( JavaIdentifier name, JavaVisibility visibility, JavaMemberKind kind, + List<JavaTypeParameter> typeParameters, JavaTypeRef returnType, java.util.List<JavaParam> params, java.util.List<JavaTypeRef> throws_, @@ -107,6 +128,7 @@ public record JavaMethodDeclaration( name, visibility, kind, + typeParameters, returnType, params, throws_, 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 e8556bc..68be253 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 @@ -791,6 +791,26 @@ public class JavaWriterTests { } @Test + public void methodWithTypeParams() throws IOException { + var java = JavaMethodDeclaration.arbitrary() + .withName(JavaIdentifier.of("a")) + .withVisibility(JavaVisibility.PUBLIC) + .withKind(JavaMemberKind.INSTANCE) + .addTypeParameter(JavaTypeParameter.arbitrary().withName(JavaIdentifier.of("T1"))) + .addTypeParameter(JavaTypeParameter.arbitrary().withName(JavaIdentifier.of("T2"))) + .withReturnType(JavaTypeRef.VOID) + .withBody(JavaBlock.EMPTY) + .build(); + + var string = write(writer -> writer.writeMethodDeclaration(java)); + + assertThat(string, equalTo(""" + public <T1, T2> void a() { + }""" + )); + } + + @Test public void methodWithParams() throws IOException { var java = JavaMethodDeclaration.arbitrary() .withName(JavaIdentifier.of("a")) diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclarationMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclarationMatcher.java index ca0b998..1bd0d6f 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclarationMatcher.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclarationMatcher.java @@ -48,6 +48,12 @@ public final class JavaMethodDeclarationMatcher implements org.zwobble.precisely return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclarationMatcher(submatchers); } + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclarationMatcher 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.JavaMethodDeclaration>>(this.submatchers); + submatchers.add(org.zwobble.precisely.Matchers.has("typeParameters", org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration::typeParameters, typeParameters)); + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclarationMatcher(submatchers); + } + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclarationMatcher withReturnType(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaTypeRef> returnType) { var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration>>(this.submatchers); submatchers.add(org.zwobble.precisely.Matchers.has("returnType", org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration::returnType, returnType)); |
