From 80087098e8fbe7841575a1df9b4b0b2cb1ad8cfc Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 26 Aug 2013 15:52:22 +0400 Subject: [PATCH] java: incorrect annotation decoding fixed --- .../ClsAnnotationParameterListImpl.java | 10 ++++++++-- .../psi/impl/compiled/StubBuildingVisitor.java | 2 +- .../testData/psi/cls/mirror/Annotations.txt | 9 +++++++++ .../psi/cls/mirror/pkg/Annotations$A1.class | Bin 206 -> 206 bytes .../psi/cls/mirror/pkg/Annotations$A2.class | Bin 278 -> 278 bytes .../psi/cls/mirror/pkg/Annotations$A3.class | Bin 356 -> 356 bytes .../psi/cls/mirror/pkg/Annotations$A4.class | Bin 256 -> 256 bytes .../psi/cls/mirror/pkg/Annotations$A5.class | Bin 0 -> 390 bytes .../pkg/Annotations$IndeterminateAnno.class | Bin 442 -> 442 bytes .../psi/cls/mirror/pkg/Annotations.class | Bin 786 -> 912 bytes .../psi/cls/mirror/src/pkg/Annotations.java | 7 +++++++ 11 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/Annotations$A5.class diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsAnnotationParameterListImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsAnnotationParameterListImpl.java index 0100ccc5e325..03a14f45d623 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsAnnotationParameterListImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsAnnotationParameterListImpl.java @@ -31,14 +31,20 @@ public class ClsAnnotationParameterListImpl extends ClsElementImpl implements Ps public ClsAnnotationParameterListImpl(@NotNull PsiAnnotation parent, @NotNull PsiNameValuePair[] psiAttributes) { myParent = parent; myAttributes = new ClsNameValuePairImpl[psiAttributes.length]; - for (int i = 0; i < myAttributes.length; i++) { + for (int i = 0; i < psiAttributes.length; i++) { String name = psiAttributes[i].getName(); + PsiAnnotationMemberValue value = psiAttributes[i].getValue(); if (value == null) { String anno = parent instanceof ClsAnnotationImpl ? ((ClsAnnotationImpl)parent).getStub().getText() : parent.getText(); - Logger.getInstance(getClass()).error("name=" + name + " anno=[" + anno + "]"); + Logger.getInstance(getClass()).error("name=" + name + " anno=[" + anno + "] file=" + parent.getContainingFile()); value = new ClsLiteralExpressionImpl(this, "null", PsiType.NULL, null); } + + if (psiAttributes.length == 1 && "value".equals(name)) { + name = null; // cosmetics - omit default attribute name + } + myAttributes[i] = new ClsNameValuePairImpl(this, name, value); } } 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 8e79478dd2d6..e9531bd3516b 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 @@ -556,7 +556,7 @@ public class StubBuildingVisitor extends ClassVisitor { myBuilder.append(','); } - if (name != null && !"value".equals(name)) { + if (name != null) { myBuilder.append(name).append('='); } } diff --git a/java/java-tests/testData/psi/cls/mirror/Annotations.txt b/java/java-tests/testData/psi/cls/mirror/Annotations.txt index 9bbe384da735..58f2792d88f3 100644 --- a/java/java-tests/testData/psi/cls/mirror/Annotations.txt +++ b/java/java-tests/testData/psi/cls/mirror/Annotations.txt @@ -25,6 +25,9 @@ abstract class Annotations { @pkg.Annotations.A4(ids = {42, 84}) abstract void m4b(); + @pkg.Annotations.A5(b = true, value = java.lang.Integer.class) + abstract void m5(); + static @interface IndeterminateAnno { float f1() default -1.0f / 0.0; @@ -39,6 +42,12 @@ abstract class Annotations { double d3() default 1.0 / 0.0; } + static @interface A5 { + boolean b() default false; + + java.lang.Class value() default java.lang.Integer.class; + } + static @interface A4 { int[] ids() default {}; } diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/Annotations$A1.class b/java/java-tests/testData/psi/cls/mirror/pkg/Annotations$A1.class index 61209608ab7ec9ccd1d015784d288e8ff2f3b842..00c4747c6521c306dea9643da2922b63f393906a 100644 GIT binary patch delta 16 YcmX@dc#e_d)W2Q(7#J9gCvqGE06Q55c>n+a delta 16 YcmX@dc#e_d)W2Q(7#J9gCUP7D06P^1cmMzZ diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/Annotations$A2.class b/java/java-tests/testData/psi/cls/mirror/pkg/Annotations$A2.class index 8d94afe6854385ffd705bf7e3c5a0285515f512f..96bda0c34281bb678b2b4885b6a52b3dc64bc5b0 100644 GIT binary patch delta 17 ZcmbQnG>wVl)W2Q(7#J9gH*)YX0suL|1#|!a delta 17 ZcmbQnG>wVl)W2Q(7#J9gHgfPW0suL@1#5cc1_lP>i5x!wGD8Lt delta 16 XcmZo*YGC3x^>5cc1_lPBi5x!wGCu|o diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/Annotations$A5.class b/java/java-tests/testData/psi/cls/mirror/pkg/Annotations$A5.class new file mode 100644 index 0000000000000000000000000000000000000000..b85d9d0abc49b14c474f06f28a3ea6e6a0342875 GIT binary patch literal 390 zcmZXQzfQw25XQetTGECB{R6Bls7i%IhKh-*QUyY)gkb2_&52BuVjPs%eK-alfQLey zGmr>|vwfex-}!uB-yfd<<~R>93@{0BN}z<`N3$(qw9>jT!sLa%moLI9 z36p5{xD$I3E1|RaPKm0zWwoWPwUL=DS?zD~ObcU6=A!@H;;KbG*|&tDC1c^Huw^PA za>d-RX{fq(4+l6SjNf0gxOH>6x*>RO8LYLIW!;yo7;k!gPIfXigo{QJzn^UtBb@xH wK6L}|INU6}4xxiCX9t}5TLdih&}Ty}qzG~7d>C*X)u&^Oc@LT4;uuYPKU{!a*#H0l literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/Annotations$IndeterminateAnno.class b/java/java-tests/testData/psi/cls/mirror/pkg/Annotations$IndeterminateAnno.class index d77b499c1f59ea89a719eed4d9eb3433fa867a62..101bbd26c3960d63b15ffc44d17c40a97e195072 100644 GIT binary patch delta 17 ZcmdnRyo;IR)W2Q(7#J9gH*#!Z1OPv$24VmJ delta 17 ZcmdnRyo;IR)W2Q(7#J9gHgarY1OPvx24MgI diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/Annotations.class b/java/java-tests/testData/psi/cls/mirror/pkg/Annotations.class index 03f1f52f42b800d671827a1378fa3ffe529ae808..a5293f04639b06e95c27e42d98d86087ff1ade9e 100644 GIT binary patch delta 397 zcmY+8%}&BV6ot=B3)A32P|za&P=u=ZQ!P{%Y;fVCiE9@cV~QapL|LeD%PUy>B*uk_ z3m?F@!3Qv&>7t2?x#!Mz&pk7*`4?q>|9*Y}=-{LP0|yG8!lA-ZY_}X=K%NE)9j#r3 zuGWr1pw(A6jxT10ybt18#R+->Vqh>z2rQnDqvy!GizXv4oIDLj!-rmSCK^Tw3&~hq ziy(OyH&csl5^#Z?Llx9q`vc-l2cgVbfMhjbqGY}Y%2qNqM_-kv z_J~!Q*Rnx*O1jSUjlK>-y-%Ocb25v5qmi=BjFnO*(7b{S(F);mWh)yOIo@XI&L!HY e-C~#h9@8cE`DMUoHF?XqR`Mh37Up>=y4D}w9w*QM delta 299 zcmY+8OHKko6h%)}1C_u)zS8_b1fl(q01Ln&VFkoU*n?^eCLV=nwTf1iLkvpfMej)`OHhz{YXaci)TOUIqph2!4q-0^VO{l;&m zA6!t3Kg@I7vzu3^6x}hD)D5IYnvK3NpK1(c)jU=;AVVhumBd~Z$!T6gn9F~xp0F@w z1^MbajTf3Sx6(m%E813iXXS(FuH^H1z0~60=qGHDvQokfS5MeA!!_567-`=!)~6sM I8}Eb3ALim1uK)l5 diff --git a/java/java-tests/testData/psi/cls/mirror/src/pkg/Annotations.java b/java/java-tests/testData/psi/cls/mirror/src/pkg/Annotations.java index 5aeda680f6dd..dafd4dce2770 100644 --- a/java/java-tests/testData/psi/cls/mirror/src/pkg/Annotations.java +++ b/java/java-tests/testData/psi/cls/mirror/src/pkg/Annotations.java @@ -16,6 +16,11 @@ abstract class Annotations { int[] ids() default { }; } + @interface A5 { + boolean b() default false; + Class value() default Integer.class; + } + @A1 abstract void m1(); @A2() abstract void m2a(); @@ -26,6 +31,8 @@ abstract class Annotations { @A4 abstract void m4a(); @A4(ids = {42, 84}) abstract void m4b(); + @A5(b = true, value = Integer.class) abstract void m5(); + @interface IndeterminateAnno { float f1() default Float.NEGATIVE_INFINITY; float f2() default Float.NaN;