From 957c0f5138db9a1c32c6dfa6e8afd4134ab35177 Mon Sep 17 00:00:00 2001 From: liach Date: Wed, 31 Mar 2021 22:50:35 -0500 Subject: [PATCH] Better char literals Signed-off-by: liach --- .../filament/mappingpoet/FieldBuilder.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/filament/src/main/java/net/fabricmc/filament/mappingpoet/FieldBuilder.java b/filament/src/main/java/net/fabricmc/filament/mappingpoet/FieldBuilder.java index 81fe104b9d..5386aad7f2 100644 --- a/filament/src/main/java/net/fabricmc/filament/mappingpoet/FieldBuilder.java +++ b/filament/src/main/java/net/fabricmc/filament/mappingpoet/FieldBuilder.java @@ -397,7 +397,9 @@ public class FieldBuilder { // fake initializer falls through case 'C': if (fieldNode.value instanceof Integer) { - return CodeBlock.builder().add("(char) $L", fieldNode.value).build(); + int value = (int) fieldNode.value; + char c = (char) value; + return printChar(CodeBlock.builder(), c, value).build(); } // fake initializer falls through case 'D': @@ -437,6 +439,34 @@ public class FieldBuilder { return CodeBlock.builder().add(desc.equals("Ljava/lang/String;") ? "java.lang.String.valueOf(\"dummy\")" : "null").build(); } + + private static CodeBlock.Builder printChar(CodeBlock.Builder builder, char c, int value) { + if (!Character.isValidCodePoint(value) || !Character.isDefined(value)) { + return builder.add("(char) $L", value); + } + + // See https://docs.oracle.com/javase/specs/jls/se16/html/jls-3.html#jls-EscapeSequence + // ignore space or ", just use direct in those cases + switch (c) { + case '\b': + return builder.add("'\\b'"); + case '\t': + return builder.add("'\\t'"); + case '\n': + return builder.add("'\\n'"); + case '\f': + return builder.add("'\\f'"); + case '\r': + return builder.add("'\\r'"); + case '\'': + return builder.add("'\\''"); + case '\\': + return builder.add("'\\\\'"); + } + + return builder.add("'$L'", c); + } + private void addJavaDoc() { mappings.addFieldDoc(builder::addJavadoc, new EntryTriple(classNode.name, fieldNode.name, fieldNode.desc)); }