From a1b78ec441aea70ae7494ca2b2925720d3f4ab3c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 12 Jun 2026 16:19:50 +0100 Subject: Add Java constructor --- .../compiler/output/lang/java/JavaWriter.java | 35 +++++++++++++++++++++- .../lang/java/ast/JavaClassBodyDeclaration.java | 2 +- .../lang/java/ast/JavaConstructorDeclaration.java | 11 +++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaConstructorDeclaration.java (limited to 'src/main/java/org/zwobble') 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 params, + JavaBlock body +) implements JavaClassBodyDeclaration { +} -- cgit v1.2.3