Better char literals

Signed-off-by: liach <liach@users.noreply.github.com>
This commit is contained in:
liach 2021-03-31 22:50:35 -05:00
parent c45cd7ab43
commit 957c0f5138
1 changed files with 31 additions and 1 deletions

View File

@ -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));
}