summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-01 09:09:31 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-01 09:09:31 +0100
commitb433dc94a228a89977da9ee6a4739e2f1da69d66 (patch)
treee9ff05f6d1b6ee0bb1eb70091d5f8bc7b1b68e39 /src
parentc69aaf0c7524dcc7a72297fd31041b68b9bc31e4 (diff)
Escape Rust strings
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java10
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java11
2 files changed, 19 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java
index 668cd75..ec8d70b 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java
@@ -648,9 +648,15 @@ public class RustWriter implements AutoCloseable {
}
private void writeStringLiteral(RustStringLiteral stringLiteral) throws IOException {
- // TODO: handle escaping
this.writer.write("\"");
- this.writer.write(stringLiteral.value());
+ this.writer.write(
+ stringLiteral.value()
+ .replace("\\", "\\\\")
+ .replace("\n", "\\n")
+ .replace("\r", "\\r")
+ .replace("\t", "\\t")
+ .replace("\0", "\\0")
+ );
this.writer.write("\"");
}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java
index 56d6d87..7272eea 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java
@@ -812,6 +812,17 @@ public class RustWriterTests {
assertThat(string, equalTo("\"hello\""));
}
+ @Test
+ public void stringLiteralWithSpecialCharacters() throws IOException {
+ var rust = RustStringLiteral.arbitrary()
+ .withValue("\n\r\t\\\0")
+ .build();
+
+ var string = write(writer -> writer.writeTopLevelExpression(rust));
+
+ assertThat(string, equalTo("\"\\n\\r\\t\\\\\\0\""));
+ }
+
// === Struct expressions ===
@Test