From 1281f5a553110a7c6a17091de13baf1b75727bca Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Sun, 4 Oct 2009 18:03:54 +0400 Subject: [PATCH] real names of cls parameters --- .../psi/impl/compiled/ClsParameterImpl.java | 14 +- .../psi/impl/compiled/ClsStubBuilder.java | 28 ++- .../java/stubs/impl/PsiParameterStubImpl.java | 20 ++- .../psi/cls/stubBuilder/TestSuite.class | Bin 0 -> 7272 bytes .../psi/cls/stubBuilder/TestSuite.txt | 162 ++++++++++++++++++ .../com/intellij/psi/ClsBuilderTest.java | 13 +- 6 files changed, 232 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/psi/cls/stubBuilder/TestSuite.class create mode 100644 java/java-tests/testData/psi/cls/stubBuilder/TestSuite.txt diff --git a/java/java-impl/src/com/intellij/psi/impl/compiled/ClsParameterImpl.java b/java/java-impl/src/com/intellij/psi/impl/compiled/ClsParameterImpl.java index bd8bda3055c3..44f4c10dae18 100644 --- a/java/java-impl/src/com/intellij/psi/impl/compiled/ClsParameterImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/compiled/ClsParameterImpl.java @@ -10,6 +10,7 @@ import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.cache.TypeInfo; import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; import com.intellij.psi.impl.java.stubs.PsiParameterStub; +import com.intellij.psi.impl.java.stubs.impl.PsiParameterStubImpl; import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.impl.source.tree.TreeElement; import com.intellij.psi.search.LocalSearchScope; @@ -48,7 +49,13 @@ public class ClsParameterImpl extends ClsRepositoryPsiElement ClsMethodImpl method = (ClsMethodImpl)getDeclarationScope(); PsiMethod sourceMethod = (PsiMethod)method.getNavigationElement(); - if (sourceMethod == method) return null; + if (sourceMethod == method) { + final PsiParameterStubImpl parameterStub = (PsiParameterStubImpl) getStub(); + if (!parameterStub.isAutoGeneratedName()) { + return parameterStub.getName(); + } + return null; + } myName = sourceMethod.getParameterList().getParameters()[getIndex()].getName(); } return myName; @@ -114,6 +121,11 @@ public class ClsParameterImpl extends ClsRepositoryPsiElement private String getMirrorName() { synchronized (LAZY_BUILT_LOCK) { if (myMirrorName == null) { + final PsiParameterStubImpl parameterStub = (PsiParameterStubImpl) getStub(); + if (!parameterStub.isAutoGeneratedName()) { + myMirrorName = parameterStub.getName(); + return myMirrorName; + } PsiParameter[] parms = ((PsiParameterList) getParent()).getParameters(); if (DumbService.getInstance(getProject()).isDumb()) { return "p" + Arrays.asList(parms).indexOf(this); diff --git a/java/java-impl/src/com/intellij/psi/impl/compiled/ClsStubBuilder.java b/java/java-impl/src/com/intellij/psi/impl/compiled/ClsStubBuilder.java index 298ad202700e..c7fd75d74173 100644 --- a/java/java-impl/src/com/intellij/psi/impl/compiled/ClsStubBuilder.java +++ b/java/java-impl/src/com/intellij/psi/impl/compiled/ClsStubBuilder.java @@ -65,7 +65,7 @@ public class ClsStubBuilder { ClassReader reader = new ClassReader(bytes); final MyClassVisitor classVisitor = new MyClassVisitor(vFile, parent, access); - reader.accept(classVisitor, ClassReader.SKIP_CODE); + reader.accept(classVisitor, 0); return classVisitor.getResult(); } @@ -379,6 +379,7 @@ public class ClsStubBuilder { final PsiParameterListStubImpl parameterList = new PsiParameterListStubImpl(stub); final int paramCount = args.size(); + final PsiParameterStubImpl[] paramStubs = new PsiParameterStubImpl[paramCount]; for (int i = 0; i < paramCount; i++) { if (nonStaticInnerClassConstructor && i == 0) continue; @@ -387,13 +388,15 @@ public class ClsStubBuilder { final TypeInfo typeInfo = TypeInfo.fromString(arg, isEllipsisParam); PsiParameterStubImpl parameterStub = new PsiParameterStubImpl(parameterList, "p" + (i + 1), typeInfo, isEllipsisParam); + paramStubs [i] = parameterStub; new PsiModifierListStubImpl(parameterStub, 0); } String[] thrownTypes = buildThrowsList(exceptions, throwables, parsedViaGenericSignature[0]); new PsiClassReferenceListStubImpl(JavaStubElementTypes.THROWS_LIST, stub, thrownTypes, PsiReferenceList.Role.THROWS_LIST); - return new AnnotationCollectingVisitor(stub, modlist[0]); + int ignoreCount = (access & Opcodes.ACC_STATIC) != 0 ? 0 : 1; + return new AnnotationParamCollectingVisitor(stub, modlist[0], ignoreCount, paramCount, paramStubs); } private static String[] buildThrowsList(String[] exceptions, List throwables, boolean parsedViaGenericSignature) { @@ -574,6 +577,27 @@ public class ClsStubBuilder { } } + private static class AnnotationParamCollectingVisitor extends AnnotationCollectingVisitor { + private final int myIgnoreCount; + private final int myParamCount; + private final PsiParameterStubImpl[] myParamStubs; + + private AnnotationParamCollectingVisitor(final StubElement owner, final PsiModifierListStub modList, int ignoreCount, int paramCount, + PsiParameterStubImpl[] paramStubs) { + super(owner, modList); + myIgnoreCount = ignoreCount; + myParamCount = paramCount; + myParamStubs = paramStubs; + } + + @Override + public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { + if (index >= myIgnoreCount && index < myIgnoreCount + myParamCount) { + myParamStubs [index - myIgnoreCount].setName(name); + } + } + } + @SuppressWarnings({"HardCodedStringLiteral"}) @Nullable private static String constToString(final Object value) { diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/impl/PsiParameterStubImpl.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/impl/PsiParameterStubImpl.java index 4f4369a80202..6ba2bf539e91 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/impl/PsiParameterStubImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/impl/PsiParameterStubImpl.java @@ -13,8 +13,10 @@ import com.intellij.psi.stubs.StubElement; import com.intellij.util.io.StringRef; import org.jetbrains.annotations.NotNull; +import java.util.List; + public class PsiParameterStubImpl extends StubBase implements PsiParameterStub { - private final StringRef myName; + private StringRef myName; private final TypeInfo myType; private final boolean myIsEllipsis; @@ -61,4 +63,20 @@ public class PsiParameterStubImpl extends StubBase implements PsiP append(']'); return builder.toString(); } + + public void setName(String name) { + myName = StringRef.fromString(name); + } + + public boolean isAutoGeneratedName() { + final List children = getParentStub().getChildrenStubs(); + int paramIndex = 0; + for (Object o : children) { + if (o instanceof PsiParameterStub) { + paramIndex++; + if (o == this) break; + } + } + return ("p" + paramIndex).equals(getName()); + } } diff --git a/java/java-tests/testData/psi/cls/stubBuilder/TestSuite.class b/java/java-tests/testData/psi/cls/stubBuilder/TestSuite.class new file mode 100644 index 0000000000000000000000000000000000000000..2764cafb38303cdb3e099f3880c2ccf9954158b2 GIT binary patch literal 7272 zcmaJ`33yc175;BBlbH;|7Dylja6rIhvH>a}K@?dOO(L2I23vKQypVxmCcc>gwN@;( zt*uKJZ8g}%wXszzizFZwm$u?kTdlU*&DzDQ)FwTIUY%D zY(9I#CM%lup;TdFu|+<370P;KeM+ICRjaoX72!#E5>WLTPQ?S_RMYWVaQ>Sd0t6 zgNiJC7YH9FQml4$-C7Z=3ZN2`g7Cp#juKQWjBSl2toF>74VK***$~%QlhH_gZN!er zcW2O(?v2sNn$}{D(B32DIkh9~a1A(i3+#y_1r5GXfT(8B;FOg%o~v|==2Qf6EM|%9 zYz05Pq@6}P6WZHj^D)#DKGad=#;nSTwRIz51yPTN0K#Ytq8tJ7PBY`iMH1iT$wVq` zXC$f$^WBh4xZDbDt0&I*H@nuf1Thcu1@G|+Re5yAp3^ctJ(lgmi43n+7xH7FM2i+K zz)2j9^z~VZZiNQ-&RJ)Su*K-(o-J4+8ctSN8tRRtLWyLkFS8*Yi-w|kdqUd2NXn`; z3Pa+E2{Fcb-;TcY(|Gx!v?U zP3*#Y!E}MbXvajeRN+*&r-rRF8eRF@;@ZRE8vXHMTqypyh{}nrBhzQugqI?$2?gXf zD}sn%gMf(!F$zK9HuK!nw5D7kY?3he!BF~olD5gd*>0#s2$$6#!zR(cSz&rU0PRUV zy~65QmCPi%SK4-xEZ;(md6~{$JGo8jj1NhLfCSe{r6LN$5zSz$fZ4_nr(%~=(`7=BN?guJwkJbrnwbjq2&7Of!CbpS;g~$4 z_GCvU+G}F9^3tf)myRV9K3u5~$_r`3+LLKxSYGNX1x44+a0RWXJ{HSBN}{F}u}?_S zF?zl&S$frc0J*qHjDM@Cgw$FYx3*XbCQw1CG|j6;lIJtHR?NSS{t(+)fr=*@lgnYM zF6eAQBJLoZoHxFZvOatvfE(Fc;b&DzM`8)uQ4|V8^F@3~pxn$zWD`+Xm(7f6Zn_n2 z(^ALf{n#nAzm-U1sr&5obKF}GQfq)84BWCctAAlQkYz<<}PPD@L^8? zd!@lnUmi(FS!86nQ94HV=_Cq8DJE{+r%)2A^<#)uSlMLgbh?E?o!iT~gl}>8Ovlwh z9Kb{3(}VOWyUxROYc2;RSzUcgHhx5*exzqtC${ngBWc?ivFX*E1|J@CT6*EQ!lZ(# zna3E!cktZ+9>@3CpBy(tqEVKpLJu4+s17C~;wWNp?fz7uR6K5NjKr5|buOuA7*>~^ zEKaTnW|`$;4{M2Y_H>Ok&Aq6V`P$57(^x zF9h(Sv{O_5IlYDl;dFNPC(^qN8cvx}UB1TRM{b3XF-etC#~L zQ-cZYO|#DMS)JvV?(8cQnJt#B*};Rt>-d9E{*P3v{We_0hc|ShUz*NU`oa@zF00?f zpGV;c{u0FR(KZTY_#1u3gI`jjcxU+bG%Ju}XDWy> z<^b^@=dRHtq-!#P_T#_w0W;3UPKDzOs* zRs`%EMn=NUB$(dhaFGUcu9eEf)1r>2S_y~#|xyCa?K3##dOE1;&SV|bXL zdei4lEWQPs-TNw*98xpXOj1)FOS^0hM`7v*tqH0rs)oc<$8m*Fe;Ko`nwQU_i^!~U z%N$-ru2RblyM4C=RlVXluu}1W;f*D_txL1#5=k{4Ivfpj`8-LaN~P~vjdCAm+Se4b zP#8cA(=tqv|3#vLPpcbmd`k+Ti z;UP>2A4Fx>xWEu5@57YcoGn2OKgaOr4qy%?LtJwlrt+KU<0?$UbUsDnF^g`PFOd9S#30DL0841AuN`eK`gB}l^=sxz8|L#;;h{qJ$paS+lgaGO0FxEY!lB6 z;r#Xih(#Y->?vK~9l-c-wWrcMzmb++e6?3qdaFH$Za?}aCA!=8pr`9Frmm~#-H&+J zUi1uL>_H^fUo?o+5YmrO=+d1>_k|zCltFxCC#D$?AI-zfBc%_j8Soj{j(c!F9>m9- z(5y!leX+<1%}JDMq0|!0#L2u^FU4v6Y~|->EJqxxc>6gWTX_S%46CW@Ond@o;d6Z6 ziZ4&3Fq%W;qmD$C(o9om4c2F1l1u5LoM&w~of1uVGc0B+0T8Zwa#h!+0&meB;hiA8B&X;#$jy%8CpJm4F zh8Z^%FjFtOKHOOC*^j#m5QTLmh%s3<(e;~|@o`MX78;bmVkAkFOGplz1W0MbCm1X_ z#I5)`28fjSbXdh@tvdXr)VWG~+{1dqn~SkW9ij%Y=jAXnux$XL_FMvnMl zpB0C4e%a;7Jz6L?h$r4x^vOcek#a;;wo9|oPugt9Y%=kDJguKs@k}q@@5T2WHY}yb zfh#EaQF`b~&h9`X(`5lu4xkA#hlsi;V#}D~-9{$NS8m6KvfL~@K*)8 zzP+aL0RFCU@e&Tbqpoxb~_Mf6V!W~?HCylrZ6LB|bd?yVX&^W?IuS4w;j{lR+ zXX9nl+JS#@-9&~-a=w&L{<_MMe^a}(*X_DZUZdU4N=rtDyGr-qT~pitXKMSq!)kj+ zE1Qv0yV}AecUa!2aSZLB!pdEXCjQ&b5oxZ*cMouMH%IrdFYeQrO^I9NgufQ!REa7j zo)Y=t!tvOd{3dBxn$ zH0Abga`yI;jHc5EFiTCQouyneT~)JWG6r%G%poh)v21V{GL5)G{U~Fc^IQoxa&%Uf zD6i&=^mN_L4wH#bGC`lB@1G{FXV@(d^B4PPHAcggh8)HQHCxT$?p~cH!j-9Ho8gL* zL#=~MVj&6RuWvY@YD*Z+Y<8H|@ErGkUhiPC!k^oLw+h{DxK{7QtWb3-?C3p}dL_m| zX=62ms!123tZoz8m$Y6J*XNlWAmw1xZrn=9m6^Diq>RKUs;4oZj}z2 z!u9I-d<`&2UMsquKk+;3mpl89XHuN-1Yz*8D?Fr5%qudd%{S<-BMkqWE`{SA)0F&& zjiYd>qK+ w0kS|>3&!c7TG$nypcW0OmSH-S*QFz