diff options
Diffstat (limited to 'src')
4 files changed, 137 insertions, 2 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 baed6d4..bcb2778 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 @@ -114,8 +114,12 @@ public class JavaWriter implements AutoCloseable { this.writer.write("}"); } - private void writeClassBodyDeclaration(JavaClassBodyDeclaration bodyDeclaration) throws IOException { + void writeClassBodyDeclaration(JavaClassBodyDeclaration bodyDeclaration) throws IOException { switch (bodyDeclaration) { + case JavaConstructorDeclaration constructorDeclaration -> { + writeConstructorDeclaration(constructorDeclaration); + } + case JavaMethodDeclaration methodDeclaration -> { writeMethodDeclaration(methodDeclaration); } @@ -126,6 +130,35 @@ public class JavaWriter implements AutoCloseable { } } + void writeConstructorDeclaration(JavaConstructorDeclaration constructor) throws IOException { + writeVisibility(constructor.visibility()); + this.writer.write(" "); + this.writer.write(constructor.typeName()); + this.writer.write("("); + + writeWithSeparator( + constructor.params(), + param -> { + writeTypeRef(param.type()); + writer.write(" "); + writer.write(param.name()); + }, + () -> writer.write(", ") + ); + + this.writer.write(")"); + + this.writer.write(" {"); + this.writer.indent(); + if (!constructor.body().isEmpty()) { + this.writer.newLine(); + writeBlock(constructor.body()); + } + this.writer.dedent(); + this.writer.newLine(); + this.writer.write("}"); + } + private void writeCustomArea(JavaCustomArea customArea) throws IOException { var customAreaName = new StringWriter(); writeTypeRef(customArea.type(), customAreaName::write); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassBodyDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassBodyDeclaration.java index ee2a3a7..3bee614 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassBodyDeclaration.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassBodyDeclaration.java @@ -1,4 +1,4 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; -public sealed interface JavaClassBodyDeclaration permits JavaMethodDeclaration, JavaTypeDeclaration { +public sealed interface JavaClassBodyDeclaration permits JavaConstructorDeclaration, JavaMethodDeclaration, JavaTypeDeclaration { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaConstructorDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaConstructorDeclaration.java new file mode 100644 index 0000000..a6799f8 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaConstructorDeclaration.java @@ -0,0 +1,11 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +import java.util.List; + +public record JavaConstructorDeclaration( + String typeName, + JavaVisibility visibility, + List<JavaParam> params, + JavaBlock body +) implements JavaClassBodyDeclaration { +} 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 426b1c1..0e24939 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 @@ -578,6 +578,97 @@ public class JavaWriterTests { } @Test + public void emptyConstructor() throws IOException { + var java = new JavaConstructorDeclaration( + "Rectangle", + JavaVisibility.PUBLIC, + List.of(), + JavaBlock.EMPTY + ); + + var string = write(writer -> writer.writeClassBodyDeclaration(java)); + + assertThat(string, equalTo(""" + public Rectangle() { + }""" + )); + } + + @Test + public void publicConstructor() throws IOException { + var java = new JavaConstructorDeclaration( + "Rectangle", + JavaVisibility.PUBLIC, + List.of(), + JavaBlock.EMPTY + ); + + var string = write(writer -> writer.writeClassBodyDeclaration(java)); + + assertThat(string, equalTo(""" + public Rectangle() { + }""" + )); + } + + @Test + public void privateConstructor() throws IOException { + var java = new JavaConstructorDeclaration( + "Rectangle", + JavaVisibility.PRIVATE, + List.of(), + JavaBlock.EMPTY + ); + + var string = write(writer -> writer.writeClassBodyDeclaration(java)); + + assertThat(string, equalTo(""" + private Rectangle() { + }""" + )); + } + + @Test + public void constructorWithParams() throws IOException { + var java = new JavaConstructorDeclaration( + "Rectangle", + JavaVisibility.PUBLIC, + List.of( + new JavaParam(JavaTypeRef.INT, "b"), + new JavaParam(JavaTypeRef.LONG, "c") + ), + JavaBlock.EMPTY + ); + + var string = write(writer -> writer.writeClassBodyDeclaration(java)); + + assertThat(string, equalTo(""" + public Rectangle(int b, long c) { + }""" + )); + } + + @Test + public void constructorWithBody() throws IOException { + var java = new JavaConstructorDeclaration( + "Rectangle", + JavaVisibility.PUBLIC, + List.of(), + new JavaBlock(List.of( + new JavaReturn(new JavaIntegerLiteral(42)) + )) + ); + + var string = write(writer -> writer.writeClassBodyDeclaration(java)); + + assertThat(string, equalTo(""" + public Rectangle() { + return 42; + }""" + )); + } + + @Test public void block() throws IOException { var java = new JavaBlock(List.of( new JavaReturn(new JavaIntegerLiteral(42)), |
