From 701b6e6f87ccffabe315b299b6ec4965e4fd7c6f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 18 May 2026 19:05:09 +0100 Subject: Add Java new expression --- .../hobgoblin/compiler/output/lang/java/JavaWriter.java | 16 ++++++++++++++++ .../compiler/output/lang/java/ast/JavaExpression.java | 2 +- .../compiler/output/lang/java/ast/JavaNewExpression.java | 9 +++++++++ .../compiler/output/lang/java/JavaWriterTests.java | 12 ++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaNewExpression.java (limited to 'src') 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 1252777..87b1aa6 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 @@ -108,6 +108,10 @@ public class JavaWriter implements AutoCloseable { case JavaIntegerLiteral integerLiteral -> { writeIntegerLiteral(integerLiteral); } + + case JavaNewExpression newExpression -> { + writeNewExpression(newExpression); + } } } @@ -167,6 +171,18 @@ public class JavaWriter implements AutoCloseable { this.writer.write("}"); } + private void writeNewExpression(JavaNewExpression newExpression) throws IOException { + this.writer.write("new "); + writeTypeRef(newExpression.type()); + this.writer.write("("); + writeWithSeparator( + newExpression.args(), + this::writeExpression, + () -> this.writer.write(", ") + ); + this.writer.write(")"); + } + private void writeRecordDeclaration(JavaRecordDeclaration recordDeclaration) throws IOException { writeDocComment(recordDeclaration.docComment()); 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 0aa202c..e90fe4e 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 { +public sealed interface JavaExpression permits JavaIntegerLiteral, JavaNewExpression { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaNewExpression.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaNewExpression.java new file mode 100644 index 0000000..b6852bf --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaNewExpression.java @@ -0,0 +1,9 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +import java.util.List; + +public record JavaNewExpression( + JavaTypeRef type, + List args +) 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 abbbeea..833b88a 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 @@ -292,6 +292,18 @@ public class JavaWriterTests { assertThat(string, equalTo("42")); } + @Test + public void newExpression() throws IOException { + var java = new JavaNewExpression( + JavaTypeRef.topLevel(List.of("one"), "Two"), + List.of(new JavaIntegerLiteral(1), new JavaIntegerLiteral(2)) + ); + + var string = write(writer -> writer.writeExpression(java)); + + assertThat(string, equalTo("new one.Two(1, 2)")); + } + @Test public void typeRefWithoutArgsHasNoAngleBrackets() throws IOException { var java = JavaTypeRef.topLevel(List.of("abc", "def"), "One"); -- cgit v1.2.3