From 1fd6faf0b9874e0962ab790e12b1f12fabac893e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 12 Jun 2026 17:10:45 +0100 Subject: Add Java field declaration --- .../hobgoblin/compiler/output/lang/java/JavaWriter.java | 13 +++++++++++++ .../output/lang/java/ast/JavaClassBodyDeclaration.java | 2 +- .../compiler/output/lang/java/ast/JavaFieldDeclaration.java | 8 ++++++++ .../compiler/output/lang/java/JavaWriterTests.java | 13 +++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaFieldDeclaration.java 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 c9f62b3..2ae41bb 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 @@ -130,6 +130,10 @@ public class JavaWriter implements AutoCloseable { writeConstructorDeclaration(constructorDeclaration); } + case JavaFieldDeclaration fieldDeclaration -> { + writeFieldDeclaration(fieldDeclaration); + } + case JavaMethodDeclaration methodDeclaration -> { writeMethodDeclaration(methodDeclaration); } @@ -232,6 +236,15 @@ public class JavaWriter implements AutoCloseable { this.writer.write(fieldAccess.fieldName()); } + private void writeFieldDeclaration(JavaFieldDeclaration fieldDeclaration) throws IOException { + this.writeVisibility(fieldDeclaration.visibility()); + this.writer.write(" final "); + this.writeTypeRef(fieldDeclaration.type()); + this.writer.write(" "); + this.writer.write(fieldDeclaration.name()); + this.writer.write(";"); + } + private void writeImplements(List implementsTypes) throws IOException { if (!implementsTypes.isEmpty()) { this.writer.write("implements "); 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 3bee614..5ce363d 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 JavaConstructorDeclaration, JavaMethodDeclaration, JavaTypeDeclaration { +public sealed interface JavaClassBodyDeclaration permits JavaConstructorDeclaration, JavaFieldDeclaration, JavaMethodDeclaration, JavaTypeDeclaration { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaFieldDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaFieldDeclaration.java new file mode 100644 index 0000000..14855de --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaFieldDeclaration.java @@ -0,0 +1,8 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public record JavaFieldDeclaration( + JavaVisibility visibility, + JavaTypeRef type, + String name +) 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 6819760..427d099 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 @@ -668,6 +668,19 @@ public class JavaWriterTests { )); } + @Test + public void fieldDeclaration() throws IOException { + var java = new JavaFieldDeclaration( + JavaVisibility.PRIVATE, + JavaTypeRef.INT, + "count" + ); + + var string = write(writer -> writer.writeClassBodyDeclaration(java)); + + assertThat(string, equalTo("private final int count;")); + } + @Test public void block() throws IOException { var java = new JavaBlock(List.of( -- cgit v1.2.3