From 11cf7f7d4d9ac12a3da7ad3919e5ce9f34203438 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 2 May 2013 16:38:57 +0200 Subject: [PATCH] IDEA-48145 (decompile class references in annotations) --- .../psi/impl/compiled/StubBuildingVisitor.java | 13 +++++++++---- .../testData/psi/cls/mirror/ClassRefs.txt | 12 ++++++++++++ .../psi/cls/mirror/pkg/AnnWithTypeLocal.class | Bin 0 -> 186 bytes .../testData/psi/cls/mirror/pkg/ClassRefs.class | Bin 0 -> 461 bytes .../psi/cls/mirror/src/pkg/ClassRefs.java | 10 ++++++++++ .../com/intellij/psi/ClsMirrorBuildingTest.java | 1 + 6 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/psi/cls/mirror/ClassRefs.txt create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/AnnWithTypeLocal.class create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/ClassRefs.class create mode 100644 java/java-tests/testData/psi/cls/mirror/src/pkg/ClassRefs.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 95daf337ebc7..8e79478dd2d6 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 @@ -340,7 +340,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())); + String initializer = constToString(value, "boolean".equals(type.text.getString()), false); PsiFieldStub stub = new PsiFieldStubImpl(myResult, name, type, initializer, flags); PsiModifierListStub modList = new PsiModifierListStubImpl(stub, packFieldFlags(access)); return new AnnotationCollectingVisitor(modList); @@ -371,7 +371,8 @@ public class StubBuildingVisitor extends ClassVisitor { return new TypeInfo(getTypeText(type), (byte)dim, false, Collections.emptyList()); //todo read annos from .class file } - private static final String[] parameterNames = {"p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9",}; + private static final String[] parameterNames = {"p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9"}; + @Override @Nullable public MethodVisitor visitMethod(final int access, @@ -536,7 +537,7 @@ public class StubBuildingVisitor extends ClassVisitor { @Override public void visit(final String name, final Object value) { valuePairPrefix(name); - myBuilder.append(constToString(value, false)); + myBuilder.append(constToString(value, false, true)); } @Override @@ -696,7 +697,7 @@ public class StubBuildingVisitor extends ClassVisitor { } @Nullable - private static String constToString(@Nullable Object value, boolean isBoolean) { + private static String constToString(@Nullable Object value, boolean isBoolean, boolean anno) { if (value == null) return null; if (value instanceof String) return "\"" + StringUtil.escapeStringCharacters((String)value) + "\""; @@ -747,6 +748,10 @@ public class StubBuildingVisitor extends ClassVisitor { return buffer.toString(); } + if (anno && value instanceof Type) { + return getTypeText((Type)value) + ".class"; + } + return null; } diff --git a/java/java-tests/testData/psi/cls/mirror/ClassRefs.txt b/java/java-tests/testData/psi/cls/mirror/ClassRefs.txt new file mode 100644 index 000000000000..ce11e0e0b329 --- /dev/null +++ b/java/java-tests/testData/psi/cls/mirror/ClassRefs.txt @@ -0,0 +1,12 @@ + + // IntelliJ API Decompiler stub source generated from a class file + // Implementation of methods is not available + +package pkg; + +class ClassRefs { + @pkg.AnnWithTypeLocal(type = java.lang.String.class) + public static final java.lang.Class cls; + + ClassRefs() { /* compiled code */ } +} diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/AnnWithTypeLocal.class b/java/java-tests/testData/psi/cls/mirror/pkg/AnnWithTypeLocal.class new file mode 100644 index 0000000000000000000000000000000000000000..9252a8ec4faf6e3bb51a3013103ebb5d248d0400 GIT binary patch literal 186 zcmX^0Z`VEs1_omWZgvI^b_Py%1};VhmXgYXR7M724Nae{#Ii*FoW#6zednCS;$mw? z2Cm@z(xT*4x6B-%5|m A!~g&Q literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/ClassRefs.class b/java/java-tests/testData/psi/cls/mirror/pkg/ClassRefs.class new file mode 100644 index 0000000000000000000000000000000000000000..ca03e1bc4c986d490fe61de060c09e66af261474 GIT binary patch literal 461 zcmZ8dO;5r=5Pe%{3$=U*h@vriR1R|RC?PQcdd#2hk7H8OK=? zhzptH)#dmjai5;#E4iqm#!&xV@4J%=3pPU~pKzu4$Gi5YBG5RbW0`b6hE6Vlff7Xq z%5cbT5S~9bK!rf$-6*V+w@;RlHM_51&*adR>9>|(fvPlC)Pp4k*i9HOD6ErBN;gSr Gp!Ef8ykC_7 literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/psi/cls/mirror/src/pkg/ClassRefs.java b/java/java-tests/testData/psi/cls/mirror/src/pkg/ClassRefs.java new file mode 100644 index 000000000000..af3784c3562f --- /dev/null +++ b/java/java-tests/testData/psi/cls/mirror/src/pkg/ClassRefs.java @@ -0,0 +1,10 @@ +package pkg; + +class ClassRefs { + @AnnWithTypeLocal(type = String.class) + public static final Class cls = String.class; // class refs are set from class initaializer +} + +@interface AnnWithTypeLocal { + Class type(); +} diff --git a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java index f15637ea703c..14c2e2927c9b 100644 --- a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java @@ -41,6 +41,7 @@ public class ClsMirrorBuildingTest extends LightIdeaTestCase { public void testPackageInfo() { doTest("package-info"); } public void testEA40568() { doTest(); } public void testBooleans() { doTest(); } + public void testClassRefs() { doTest(); } private void doTest() { doTest(getTestName(false));