summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java16
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java5
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaParam.java7
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java2
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java47
5 files changed, 70 insertions, 7 deletions
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<JavaParam> 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<String> packageName, String name, List<JavaTypeRef> 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
@@ -198,6 +202,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());