From da958ab49ca8fb2649d44dd9e84eb4207d238228 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Mon, 26 Aug 2013 17:32:33 +0400 Subject: [PATCH] Decompile chars, bytes and shorts correctly --- .../impl/compiled/StubBuildingVisitor.java | 33 +++++++++----- .../testData/psi/cls/mirror/Booleans.txt | 18 -------- .../testData/psi/cls/mirror/Primitives.txt | 30 +++++++++++++ .../psi/cls/mirror/pkg/BooleanAnno.class | Bin 165 -> 167 bytes .../psi/cls/mirror/pkg/Booleans.class | Bin 449 -> 0 bytes .../psi/cls/mirror/pkg/ByteAnno.class | Bin 0 -> 164 bytes .../psi/cls/mirror/pkg/CharAnno.class | Bin 0 -> 164 bytes .../testData/psi/cls/mirror/pkg/IntAnno.class | Bin 0 -> 163 bytes .../psi/cls/mirror/pkg/LongAnno.class | Bin 0 -> 164 bytes .../psi/cls/mirror/pkg/Primitives.class | Bin 0 -> 788 bytes .../psi/cls/mirror/pkg/ShortAnno.class | Bin 0 -> 165 bytes .../psi/cls/mirror/src/pkg/Booleans.java | 13 ------ .../psi/cls/mirror/src/pkg/Primitives.java | 42 ++++++++++++++++++ .../intellij/psi/ClsMirrorBuildingTest.java | 2 +- 14 files changed, 96 insertions(+), 42 deletions(-) delete mode 100644 java/java-tests/testData/psi/cls/mirror/Booleans.txt create mode 100644 java/java-tests/testData/psi/cls/mirror/Primitives.txt delete mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/Booleans.class create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/ByteAnno.class create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/CharAnno.class create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/IntAnno.class create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/LongAnno.class create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/Primitives.class create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/ShortAnno.class delete mode 100644 java/java-tests/testData/psi/cls/mirror/src/pkg/Booleans.java create mode 100644 java/java-tests/testData/psi/cls/mirror/src/pkg/Primitives.java 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 e9531bd3516b..82569b97d91f 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 @@ -17,9 +17,7 @@ package com.intellij.psi.impl.compiled; import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; -import com.intellij.psi.CommonClassNames; -import com.intellij.psi.PsiNameHelper; -import com.intellij.psi.PsiReferenceList; +import com.intellij.psi.*; import com.intellij.psi.impl.cache.ModifierFlags; import com.intellij.psi.impl.cache.TypeInfo; import com.intellij.psi.impl.java.stubs.*; @@ -340,7 +338,7 @@ public class StubBuildingVisitor extends ClassVisitor { byte flags = PsiFieldStubImpl.packFlags((access & Opcodes.ACC_ENUM) != 0, (access & Opcodes.ACC_DEPRECATED) != 0, false); TypeInfo type = fieldType(desc, signature); - String initializer = constToString(value, "boolean".equals(type.text.getString()), false); + String initializer = constToString(value, type.text.getString(), false); PsiFieldStub stub = new PsiFieldStubImpl(myResult, name, type, initializer, flags); PsiModifierListStub modList = new PsiModifierListStubImpl(stub, packFieldFlags(access)); return new AnnotationCollectingVisitor(modList); @@ -537,7 +535,7 @@ public class StubBuildingVisitor extends ClassVisitor { @Override public void visit(final String name, final Object value) { valuePairPrefix(name); - myBuilder.append(constToString(value, false, true)); + myBuilder.append(constToString(value, null, true)); } @Override @@ -697,18 +695,33 @@ public class StubBuildingVisitor extends ClassVisitor { } @Nullable - private static String constToString(@Nullable Object value, boolean isBoolean, boolean anno) { + private static String constToString(@Nullable Object value, @Nullable String type, boolean anno) { if (value == null) return null; - if (value instanceof String) return "\"" + StringUtil.escapeStringCharacters((String)value) + "\""; - if (value instanceof Boolean) return value.toString(); - if (value instanceof Long) return value.toString() + "L"; + if (value instanceof String) { + return "\"" + StringUtil.escapeStringCharacters((String)value) + "\""; + } + + if (value instanceof Boolean || value instanceof Short || value instanceof Byte) { + return value.toString(); + } + + if (value instanceof Character) { + return "'" + value.toString() + "'"; + } + + if (value instanceof Long) { + return value.toString() + "L"; + } if (value instanceof Integer) { - if (isBoolean) { + if ("boolean".equals(type)) { if (value.equals(0)) return "false"; if (value.equals(1)) return "true"; } + if ("char".equals(type)) { + return "'" + ((char)((Integer)value).intValue()) + "'"; + } return value.toString(); } diff --git a/java/java-tests/testData/psi/cls/mirror/Booleans.txt b/java/java-tests/testData/psi/cls/mirror/Booleans.txt deleted file mode 100644 index 8def7d921ba3..000000000000 --- a/java/java-tests/testData/psi/cls/mirror/Booleans.txt +++ /dev/null @@ -1,18 +0,0 @@ - - // IntelliJ API Decompiler stub source generated from a class file - // Implementation of methods is not available - -package pkg; - -class Booleans { - public static final boolean TRUE = true; - public static final boolean FALSE = false; - - Booleans() { /* compiled code */ } - - @pkg.BooleanAnno(true) - public static boolean TRUE() { /* compiled code */ } - - @pkg.BooleanAnno(false) - public static boolean FALSE() { /* compiled code */ } -} \ No newline at end of file diff --git a/java/java-tests/testData/psi/cls/mirror/Primitives.txt b/java/java-tests/testData/psi/cls/mirror/Primitives.txt new file mode 100644 index 000000000000..37887d7110fa --- /dev/null +++ b/java/java-tests/testData/psi/cls/mirror/Primitives.txt @@ -0,0 +1,30 @@ + + // IntelliJ API Decompiler stub source generated from a class file + // Implementation of methods is not available + +package pkg; + +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 short SHORT = 42; + public static final int INT = 42; + public static final long LONG = 42L; + + Primitives() { /* compiled code */ } + + @pkg.BooleanAnno(true) + public static boolean TRUE() { /* compiled code */ } + + @pkg.BooleanAnno(false) + public static boolean FALSE() { /* compiled code */ } + + @pkg.ByteAnno(1) + @pkg.CharAnno('c') + @pkg.ShortAnno(42) + @pkg.IntAnno(42) + @pkg.LongAnno(42L) + public static void m() { /* compiled code */ } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/BooleanAnno.class b/java/java-tests/testData/psi/cls/mirror/pkg/BooleanAnno.class index 64ba86fc5932e1be49cb8754d08ca87d4e4bc36b..118a4c4df8ca379c8c579da5265f310179994fe8 100644 GIT binary patch delta 20 bcmZ3=xSVl<0T+KjQD$ytNoHB^L$e{HOBH-g~wY)EY@e$s+!*I0d@%*T2$P~(Ulj_G&QORO_r@X*g(F8$0C; zV+8f?%k#8x8^@7W)=#b&w(`k>Qa?@>6WuZ1tn$lQUd+@=l~KZmp!`Qnvzi|@B4wwI zhw)5L98QqoH^F*%t=STlC6c`v;=&MDqXu diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/ByteAnno.class b/java/java-tests/testData/psi/cls/mirror/pkg/ByteAnno.class new file mode 100644 index 0000000000000000000000000000000000000000..6250428694f721862d05fb8d2de5e898744b49cd GIT binary patch literal 164 zcmX^0Z`VEs1_omWZgvI^b_Py%1};Vh*0RK$(o{wUW(`dzMh33n{L-T2RJY6=pb&pR zQD$ytNoHAUv0heUSt26?PeFFNzEfpMs$*VWJ|lwwNK`*3F)v-;KPf9UxrC8H9wC$n rR8x{zl9`{U4^j?csxdGyGB5!#GtecBEQ|~+46Gm)0~?TJVqgaV0)8i~ literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/CharAnno.class b/java/java-tests/testData/psi/cls/mirror/pkg/CharAnno.class new file mode 100644 index 0000000000000000000000000000000000000000..17e8b6729b29a67386cce30a1c908dc9c167e8bd GIT binary patch literal 164 zcmX^0Z`VEs1_omWZgvI^b_Py%1};Vh*0RK$(o{wUW(`eeMh33n{L-T2RJY6=pb&pR zQD$ytNoHAUv0heUSt26?PeFFNzH>%mkz-z7J|lwwNK`*3F)v-;KPf9UxrC8H9wC$n rR8x{zl9`{U4^j?csxdGyGB5!#GtecBEQ|~+46Gm)0~?TJVqgaV`voVL literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/IntAnno.class b/java/java-tests/testData/psi/cls/mirror/pkg/IntAnno.class new file mode 100644 index 0000000000000000000000000000000000000000..e3e7eed220b04e0545d871ddaef193c5b1d8b6e3 GIT binary patch literal 163 zcmX^0Z`VEs1_omWZgvI^b_Py%1};Vh*0RK$(o{wUW(`eGMh33n{L-T2RJY6=pb&pR zQD$ytNoHAUv0heUSt26?cR_Z#zGq&EV_sf9BZB})P(LRzFJ0e1DJwO(gpolWA(RMI qQ<7McnV+W*QVwCNF)%PPFaa?$&>@U0j0`LctRNNx8<1pTUhQ^+T z<5}d;tQ2yGEk8IA0-D<&`eJSqx<{=Zp)1mmzTl|a>$4C@frA~dBh;hS?{?l19_M5V zAFBB`+GzWhw%xr`nHGPH6l%UUQD-(8L`gp!j9H<~WOsTqWA!BR%v?`3g_bd~4XtKi zg}VRw)2P{w<8c%kQC>67T)u%zCkoYt{>7$k6c+{eJWQ7ETIvYS$-fd9qB(i~sQw^)jwq(l=09@hbHiHdnk(ejPV1@te4{;#=GXNy*AK(LJ7u zXKw#H)HecNI^X%U=%7UVUB(jYc3NY|?AJA4fn$({yid=AGk!%0#jB0ZdSh|DvBbt5 whFffGaH>34g4NT$ChzH?ENpY(BLOa|cq|}59Zv*!1WyGVV~fW#PRro=A8h7vA^-pY literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/ShortAnno.class b/java/java-tests/testData/psi/cls/mirror/pkg/ShortAnno.class new file mode 100644 index 0000000000000000000000000000000000000000..e5583b1cca2e3caf085dc50ae21312c0af5d989c GIT binary patch literal 165 zcmYL@Jq`jP7)0mWAJH{NZ(wJ%k-`($*lNNFa6?vB1cNMxv+w{O$_TNrn91bj74!Z) zUjTNPGK?7}3=N@<(hQ1Ft~Y|v2sijv9kfYke)9UJgO2L4?PZjN+5OsaadAHEt#yP& q#@tBT@#DEyZ6GZFNG2!9pq=Ge|IHOZC{oIFg(^aYIxmb;7hqpX