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 64ba86fc5932..118a4c4df8ca 100644 Binary files a/java/java-tests/testData/psi/cls/mirror/pkg/BooleanAnno.class and b/java/java-tests/testData/psi/cls/mirror/pkg/BooleanAnno.class differ diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/Booleans.class b/java/java-tests/testData/psi/cls/mirror/pkg/Booleans.class deleted file mode 100644 index 1a71ca06f3c4..000000000000 Binary files a/java/java-tests/testData/psi/cls/mirror/pkg/Booleans.class and /dev/null differ 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 000000000000..6250428694f7 Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/ByteAnno.class differ 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 000000000000..17e8b6729b29 Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/CharAnno.class differ 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 000000000000..e3e7eed220b0 Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/IntAnno.class differ diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/LongAnno.class b/java/java-tests/testData/psi/cls/mirror/pkg/LongAnno.class new file mode 100644 index 000000000000..63147056a558 Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/LongAnno.class differ diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/Primitives.class b/java/java-tests/testData/psi/cls/mirror/pkg/Primitives.class new file mode 100644 index 000000000000..fe1c7fd786c2 Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/Primitives.class differ 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 000000000000..e5583b1cca2e Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/ShortAnno.class differ diff --git a/java/java-tests/testData/psi/cls/mirror/src/pkg/Booleans.java b/java/java-tests/testData/psi/cls/mirror/src/pkg/Booleans.java deleted file mode 100644 index 495e1ace68a3..000000000000 --- a/java/java-tests/testData/psi/cls/mirror/src/pkg/Booleans.java +++ /dev/null @@ -1,13 +0,0 @@ -package pkg; - -class Booleans { - public static final boolean TRUE = true; - public static final boolean FALSE = false; - - @BooleanAnno(true) public static boolean TRUE() { return TRUE; } - @BooleanAnno(false) public static boolean FALSE() { return FALSE; } -} - -@interface BooleanAnno { - boolean value(); -} \ No newline at end of file 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 new file mode 100644 index 000000000000..fbdf2a82090b --- /dev/null +++ b/java/java-tests/testData/psi/cls/mirror/src/pkg/Primitives.java @@ -0,0 +1,42 @@ +package pkg; + +class Primitives { + public static final boolean TRUE = true; + public static final boolean FALSE = false; + + @BooleanAnno(true) public static boolean TRUE() { return TRUE; } + @BooleanAnno(false) public static boolean FALSE() { return 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; + + @ByteAnno(1) @CharAnno('c') @ShortAnno(42) @IntAnno(42) @LongAnno(42L) + public static void m() { } +} + +@interface BooleanAnno { + boolean value(); +} + +@interface ByteAnno { + byte value(); +} + +@interface CharAnno { + char value(); +} + +@interface ShortAnno { + short value(); +} + +@interface IntAnno { + int value(); +} + +@interface LongAnno { + long value(); +} diff --git a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java index 0217607f1793..a7deee87bada 100644 --- a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java @@ -40,7 +40,7 @@ public class ClsMirrorBuildingTest extends LightIdeaTestCase { public void testMethodReceiver() { doTest(); } public void testPackageInfo() { doTest("package-info"); } public void testEA40568() { doTest(); } - public void testBooleans() { doTest(); } + public void testPrimitives() { doTest(); } public void testClassRefs() { doTest(); } public void testEA46236() { doTest("ValuedEnum"); }