From 36a11cc4637ab14718ddf73921a1c0658c9056d0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 17 May 2026 10:14:51 +0100 Subject: Add params to Java method node --- .../compiler/output/lang/java/JavaWriter.java | 16 +++++++- .../lang/java/ast/JavaMethodDeclaration.java | 5 ++- .../compiler/output/lang/java/ast/JavaParam.java | 7 ++++ .../compiler/output/lang/java/ast/JavaTypeRef.java | 2 + .../compiler/output/lang/java/JavaWriterTests.java | 47 ++++++++++++++++++++-- 5 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaParam.java (limited to 'src') 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 9d74d7d..1a5fe29 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 @@ -83,12 +83,24 @@ public class JavaWriter implements AutoCloseable { } } - private void writeMethodDeclaration(JavaMethodDeclaration method) throws IOException { + void writeMethodDeclaration(JavaMethodDeclaration method) throws IOException { this.writer.write("public "); writeTypeRef(method.returnType()); this.writer.write(" "); this.writer.write(method.name()); - this.writer.write("() {"); + this.writer.write("("); + + writeWithSeparator( + method.params(), + param -> { + writeTypeRef(param.type()); + writer.write(" "); + writer.write(param.name()); + }, + () -> writer.write(", ") + ); + + this.writer.write(") {"); this.writer.newLine(); this.writer.write("}"); } 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 84179f6..fb29f5c 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 @@ -1,7 +1,10 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; +import java.util.List; + public record JavaMethodDeclaration( String name, - JavaTypeRef returnType + JavaTypeRef returnType, + List params ) implements JavaClassBodyDeclaration { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaParam.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaParam.java new file mode 100644 index 0000000..49a7f5f --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaParam.java @@ -0,0 +1,7 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public record JavaParam( + JavaTypeRef type, + String name +) { +} 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 3654acc..9020791 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 @@ -3,5 +3,7 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; import java.util.List; public record JavaTypeRef(List packageName, String name, List args) { + public static final JavaTypeRef INT = new JavaTypeRef(List.of(), "int", List.of()); + public static final JavaTypeRef LONG = new JavaTypeRef(List.of(), "long", List.of()); public static final JavaTypeRef VOID = new JavaTypeRef(List.of(), "void", List.of()); } 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 0d36bcb..28e7486 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 @@ -36,11 +36,13 @@ public class JavaWriterTests { List.of( new JavaMethodDeclaration( "a", - JavaTypeRef.VOID + JavaTypeRef.VOID, + List.of() ), new JavaMethodDeclaration( "b", - JavaTypeRef.VOID + JavaTypeRef.VOID, + List.of() ) ), DocComment.EMPTY @@ -174,11 +176,13 @@ public class JavaWriterTests { List.of( new JavaMethodDeclaration( "a", - JavaTypeRef.VOID + JavaTypeRef.VOID, + List.of() ), new JavaMethodDeclaration( "b", - JavaTypeRef.VOID + JavaTypeRef.VOID, + List.of() ) ), DocComment.EMPTY @@ -197,6 +201,41 @@ public class JavaWriterTests { )); } + @Test + public void emptyMethod() throws IOException { + var java = new JavaMethodDeclaration( + "a", + JavaTypeRef.VOID, + List.of() + ); + + var string = write(writer -> writer.writeMethodDeclaration(java)); + + assertThat(string, equalTo(""" + public void a() { + }""" + )); + } + + @Test + public void methodWithParams() throws IOException { + var java = new JavaMethodDeclaration( + "a", + JavaTypeRef.VOID, + List.of( + new JavaParam(JavaTypeRef.INT, "b"), + new JavaParam(JavaTypeRef.LONG, "c") + ) + ); + + var string = write(writer -> writer.writeMethodDeclaration(java)); + + assertThat(string, equalTo(""" + public void a(int b, long c) { + }""" + )); + } + @Test public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException { var java = new JavaTypeRef(List.of("abc", "def"), "One", List.of()); -- cgit v1.2.3