summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-01 09:06:19 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-01 09:06:19 +0100
commitc69aaf0c7524dcc7a72297fd31041b68b9bc31e4 (patch)
treede3853556f6bbf62089dd8aa0be2935254121d67
parentf116e66bc7dc2743a71e4a5105351b348c1d0582 (diff)
Escape Java strings
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java12
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriterTests.java9
2 files changed, 19 insertions, 2 deletions
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 6c7410e..d46511b 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
@@ -890,9 +890,17 @@ public class JavaWriter implements AutoCloseable {
}
private void writeStringLiteral(JavaStringLiteral stringLiteral) throws IOException {
- // TODO: escaping
this.writer.write("\"");
- this.writer.write(stringLiteral.value());
+ this.writer.write(
+ stringLiteral.value()
+ .replace("\\", "\\\\")
+ .replace("\t", "\\t")
+ .replace("\b", "\\b")
+ .replace("\n", "\\n")
+ .replace("\r", "\\r")
+ .replace("\f", "\\f")
+ .replace("\"", "\\\"")
+ );
this.writer.write("\"");
}
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 fe5fa81..f45a432 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
@@ -1615,6 +1615,15 @@ public class JavaWriterTests {
assertThat(string, equalTo("\"hello\""));
}
+ @Test
+ public void stringLiteralWithSpecialCharacters() throws IOException {
+ var java = new JavaStringLiteral("\t\b\n\r\f\"\\");
+
+ var string = write(writer -> writer.writeTopLevelExpression(java));
+
+ assertThat(string, equalTo("\"\\t\\b\\n\\r\\f\\\"\\\\\""));
+ }
+
// === Precedence handling ===
@Test