From 4e8d3aa3f1ec9372e97098d0c247ef104edfb012 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 18 May 2026 23:48:33 +0100 Subject: Add build method to builders --- .../output/generators/javatypes/JavaTypesGenerator.java | 14 +++++++++++++- .../hobgoblin/compiler/output/lang/java/JavaWriter.java | 8 ++++++++ .../compiler/output/lang/java/ast/JavaExpression.java | 2 +- .../hobgoblin/compiler/output/lang/java/ast/JavaRef.java | 4 ++++ .../compiler/output/lang/java/JavaWriterTests.java | 9 +++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRef.java diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index 2efd1ec..92c60d4 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java @@ -123,7 +123,19 @@ public class JavaTypesGenerator implements Generator { "Builder", components, List.of(), - List.of(), + List.of( + new JavaMethodDeclaration( + "build", + generateTypeRef(structDefinition.type()), + List.of(), + new JavaBlock(List.of( + new JavaReturn(new JavaNewExpression( + generateTypeRef(structDefinition.type()), + components.stream().map(component -> new JavaRef(component.name())).toList() + )) + )) + ) + ), DocComment.EMPTY ) ), 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 87b1aa6..9707ab5 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 @@ -112,6 +112,10 @@ public class JavaWriter implements AutoCloseable { case JavaNewExpression newExpression -> { writeNewExpression(newExpression); } + + case JavaRef ref -> { + writeRef(ref); + } } } @@ -229,6 +233,10 @@ public class JavaWriter implements AutoCloseable { this.writer.write("}"); } + private void writeRef(JavaRef ref) throws IOException { + this.writer.write(ref.name()); + } + private void writeReturnStatement(JavaReturn returnStatement) throws IOException { this.writer.write("return "); writeExpression(returnStatement.value()); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java index e90fe4e..03d54dd 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaExpression.java @@ -1,4 +1,4 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; -public sealed interface JavaExpression permits JavaIntegerLiteral, JavaNewExpression { +public sealed interface JavaExpression permits JavaIntegerLiteral, JavaNewExpression, JavaRef { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRef.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRef.java new file mode 100644 index 0000000..0ccc05c --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaRef.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public record JavaRef(String name) implements JavaExpression { +} 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 833b88a..531a7ff 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 @@ -304,6 +304,15 @@ public class JavaWriterTests { assertThat(string, equalTo("new one.Two(1, 2)")); } + @Test + public void ref() throws IOException { + var java = new JavaRef("x"); + + var string = write(writer -> writer.writeExpression(java)); + + assertThat(string, equalTo("x")); + } + @Test public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException { var java = JavaTypeRef.topLevel(List.of("abc", "def"), "One"); -- cgit v1.2.3