From 8f3c91fbde19b8711d7a0b86ca4a972559025bf9 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 28 Aug 2013 19:12:17 +0400 Subject: [PATCH] java: correct character escaping in decompiler --- .../psi/impl/compiled/StubBuildingVisitor.java | 5 +++-- .../testData/psi/cls/mirror/Primitives.txt | 4 ++-- .../psi/cls/mirror/pkg/Primitives.class | Bin 788 -> 793 bytes .../psi/cls/mirror/src/pkg/Primitives.java | 4 ++-- .../intellij/openapi/util/text/StringUtil.java | 8 +++++++- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java index 82569b97d91f..7324f7bbcb4b 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java @@ -707,7 +707,7 @@ public class StubBuildingVisitor extends ClassVisitor { } if (value instanceof Character) { - return "'" + value.toString() + "'"; + return "'" + StringUtil.escapeCharCharacters(value.toString()) + "'"; } if (value instanceof Long) { @@ -720,7 +720,8 @@ public class StubBuildingVisitor extends ClassVisitor { if (value.equals(1)) return "true"; } if ("char".equals(type)) { - return "'" + ((char)((Integer)value).intValue()) + "'"; + char ch = (char)((Integer)value).intValue(); + return "'" + StringUtil.escapeCharCharacters(String.valueOf(ch)) + "'"; } return value.toString(); } diff --git a/java/java-tests/testData/psi/cls/mirror/Primitives.txt b/java/java-tests/testData/psi/cls/mirror/Primitives.txt index 37887d7110fa..4eb6750d0451 100644 --- a/java/java-tests/testData/psi/cls/mirror/Primitives.txt +++ b/java/java-tests/testData/psi/cls/mirror/Primitives.txt @@ -8,7 +8,7 @@ class Primitives { public static final boolean TRUE = true; public static final boolean FALSE = false; public static final byte BYTE = 1; - public static final char CHAR = 'c'; + public static final char CHAR = '\''; public static final short SHORT = 42; public static final int INT = 42; public static final long LONG = 42L; @@ -22,7 +22,7 @@ class Primitives { public static boolean FALSE() { /* compiled code */ } @pkg.ByteAnno(1) - @pkg.CharAnno('c') + @pkg.CharAnno('\\') @pkg.ShortAnno(42) @pkg.IntAnno(42) @pkg.LongAnno(42L) diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/Primitives.class b/java/java-tests/testData/psi/cls/mirror/pkg/Primitives.class index fe1c7fd786c2740ed85ea1d80960994293640f84..1e2d9f0a17ff2714e9ba7dd98a7ab25d322b5b70 100644 GIT binary patch delta 84 zcmbQjHj_>C)W2Q(7#J9g8FaW9m>D$L8MN3Lv?q$XGpbLF-OI`hl#1Cb#dw8LO_@Q3 ffssKzm_d+16~yoaGSol}F9tCnr4Cfd#GnBH%t{Q_ delta 78 zcmbQqHib>})W2Q(7#J9g8ML_=m>D$K88q1$v?hwWGbT@r-Md+y@d~3FAA>RjBZGV} agCK(nh~WujsDc diff --git a/java/java-tests/testData/psi/cls/mirror/src/pkg/Primitives.java b/java/java-tests/testData/psi/cls/mirror/src/pkg/Primitives.java index fbdf2a82090b..4ffcf4ae3634 100644 --- a/java/java-tests/testData/psi/cls/mirror/src/pkg/Primitives.java +++ b/java/java-tests/testData/psi/cls/mirror/src/pkg/Primitives.java @@ -8,12 +8,12 @@ class Primitives { @BooleanAnno(false) public static boolean FALSE() { return FALSE; } public static final byte BYTE = 1; - public static final char CHAR = 'c'; + public static final char CHAR = '\''; public static final short SHORT = 42; public static final int INT = 42; public static final long LONG = 42L; - @ByteAnno(1) @CharAnno('c') @ShortAnno(42) @IntAnno(42) @LongAnno(42L) + @ByteAnno(1) @CharAnno('\\') @ShortAnno(42) @IntAnno(42) @LongAnno(42L) public static void m() { } } diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index eb99bbd45c57..225a51f3214c 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -536,10 +536,16 @@ public class StringUtil extends StringUtilRt { @NotNull public static String escapeStringCharacters(@NotNull String s) { StringBuilder buffer = new StringBuilder(s.length()); - escapeStringCharacters(s.length(), s, buffer); + escapeStringCharacters(s.length(), s, "\"", buffer); return buffer.toString(); } + @NotNull + public static String escapeCharCharacters(@NotNull String s) { + StringBuilder buffer = new StringBuilder(s.length()); + escapeStringCharacters(s.length(), s, "\'", buffer); + return buffer.toString(); + } @NotNull public static String unescapeStringCharacters(@NotNull String s) {