From 29563953f767d049d152a42e2da5a50bf377fad2 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 29 May 2026 09:31:51 +0100 Subject: Add (unescaped) Java string literals --- .../hobgoblin/compiler/output/lang/java/JavaWriter.java | 11 +++++++++++ .../compiler/output/lang/java/ast/JavaExpression.java | 2 +- .../compiler/output/lang/java/ast/JavaStringLiteral.java | 4 ++++ .../hobgoblin/compiler/output/lang/java/JavaWriterTests.java | 9 +++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaStringLiteral.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 82c2f9b..3e1a266 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 @@ -141,6 +141,10 @@ public class JavaWriter implements AutoCloseable { case JavaStaticMethodCall staticMethodCall -> { writeStaticMethodCall(staticMethodCall); } + + case JavaStringLiteral stringLiteral -> { + writeStringLiteral(stringLiteral); + } } } @@ -303,6 +307,13 @@ public class JavaWriter implements AutoCloseable { this.writer.write(")"); } + private void writeStringLiteral(JavaStringLiteral stringLiteral) throws IOException { + // TODO: escaping + this.writer.write("\""); + this.writer.write(stringLiteral.value()); + this.writer.write("\""); + } + void writeTypeRef(JavaTypeRef type) throws IOException { writeTypeRef(type, writer::write); } 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 63ee145..a8cb596 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, JavaMethodCall, JavaNewExpression, JavaRef, JavaStaticMethodCall { +public sealed interface JavaExpression permits JavaIntegerLiteral, JavaMethodCall, JavaNewExpression, JavaRef, JavaStaticMethodCall, JavaStringLiteral { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaStringLiteral.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaStringLiteral.java new file mode 100644 index 0000000..28fc5d7 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaStringLiteral.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.output.lang.java.ast; + +public record JavaStringLiteral(String value) 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 beef2ca..2006b50 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 @@ -347,6 +347,15 @@ public class JavaWriterTests { assertThat(string, equalTo("42")); } + @Test + public void stringLiteral() throws IOException { + var java = new JavaStringLiteral("hello"); + + var string = write(writer -> writer.writeExpression(java)); + + assertThat(string, equalTo("\"hello\"")); + } + @Test public void newExpression() throws IOException { var java = new JavaNewExpression( -- cgit v1.2.3