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 000000000000..9252a8ec4faf Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/AnnWithTypeLocal.class differ 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 000000000000..ca03e1bc4c98 Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/ClassRefs.class differ 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));