From 4df07088805001dcaa633ca7572455efbb431142 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 30 May 2017 21:24:47 +0300 Subject: [PATCH] [java] reads MethodParameters attribute on building .class stubs (IDEA-173644) --- .../impl/compiled/StubBuildingVisitor.java | 34 +++++++++++------- .../stubBuilder/EnumMethodParameters.class | Bin 0 -> 1150 bytes .../cls/stubBuilder/EnumMethodParameters.txt | 19 ++++++++++ .../InterfaceMethodParameters.class | Bin 0 -> 213 bytes .../stubBuilder/InterfaceMethodParameters.txt | 17 +++++++++ .../intellij/java/psi/ClsStubBuilderTest.java | 2 ++ 6 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 java/java-tests/testData/psi/cls/stubBuilder/EnumMethodParameters.class create mode 100644 java/java-tests/testData/psi/cls/stubBuilder/EnumMethodParameters.txt create mode 100644 java/java-tests/testData/psi/cls/stubBuilder/InterfaceMethodParameters.class create mode 100644 java/java-tests/testData/psi/cls/stubBuilder/InterfaceMethodParameters.txt 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 72b31195db9a..c71e43baad7c 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 @@ -42,9 +42,7 @@ import java.io.IOException; import java.lang.reflect.Array; import java.text.CharacterIterator; import java.text.StringCharacterIterator; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import static com.intellij.openapi.util.Pair.pair; import static com.intellij.util.BitUtil.isSet; @@ -545,6 +543,7 @@ public class StubBuildingVisitor extends ClassVisitor { private final int myParamCount; private final PsiParameterStubImpl[] myParamStubs; private final Function myMapping; + private int myParamNameIndex; private int myUsedParamSize; private int myUsedParamCount; private List> myFilters; @@ -605,22 +604,31 @@ public class StubBuildingVisitor extends ClassVisitor { return new AnnotationTextCollector(null, myMapping, text -> ((PsiMethodStubImpl)myOwner).setDefaultValueText(text)); } + @Override + public void visitParameter(String name, int access) { + if ((access & Opcodes.ACC_SYNTHETIC) == 0 && myParamNameIndex < myParamCount) { + setName(name, myParamNameIndex); + myParamNameIndex++; + } + } + @Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { if (index >= myIgnoreCount) { // long and double variables increase the index by 2, not by 1 int paramIndex = index - myIgnoreCount == myUsedParamSize ? myUsedParamCount : index - myIgnoreCount; - if (paramIndex >= myParamCount) return; - - if (ClsParsingUtil.isJavaIdentifier(name, LanguageLevel.HIGHEST)) { - PsiParameterStubImpl parameterStub = myParamStubs[paramIndex]; - if (parameterStub != null) { - parameterStub.setName(name); - } + if (paramIndex < myParamCount) { + setName(name, paramIndex); + myUsedParamCount = paramIndex + 1; + myUsedParamSize += "D".equals(desc) || "J".equals(desc) ? 2 : 1; } + } + } - myUsedParamCount = paramIndex + 1; - myUsedParamSize += "D".equals(desc) || "J".equals(desc) ? 2 : 1; + private void setName(String name, int paramIndex) { + if (ClsParsingUtil.isJavaIdentifier(name, LanguageLevel.HIGHEST)) { + PsiParameterStubImpl stub = myParamStubs[paramIndex]; + if (stub != null) stub.setName(name); } } @@ -774,7 +782,7 @@ public class StubBuildingVisitor extends ClassVisitor { className = p.first; if (p.second != null) { className = fun(p.first) + '.' + p.second; - mapping.put(className, pair(className, (String)null)); + mapping.put(className, pair(className, null)); } } diff --git a/java/java-tests/testData/psi/cls/stubBuilder/EnumMethodParameters.class b/java/java-tests/testData/psi/cls/stubBuilder/EnumMethodParameters.class new file mode 100644 index 0000000000000000000000000000000000000000..2b8d6b3ca145778fd8fdd0bd22428e779d1a1d28 GIT binary patch literal 1150 zcma)5?@!ZE6g_Y4)~ys7Q;^>RPTfF36#TWhpahd8Q%t5L>Ziw6prmV)uH&ns#i^3IZ8vbQA|F0%p zZn(X^w1O&cJeGT%`O2p~(# zHzZD=eWAsk_)c~2I58?Qj6@f|%w0v8IeqRJ$rI=bpE!rVPLCC#FoIE9V_ZprkN|w&gdTc6_MQ!l-7bv%k$+%1-bhOOAy3PMC|V4qWkG7@;)5 zKQ~GnLZC${hl=2JeB`i@S5=Bl(+NV9e_r%*G$ODsTEU<5{?v-n1U3{Ln-U<8;KH-) STZ&x-b}(C$@rbGI4#GFKOfg0P literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/psi/cls/stubBuilder/InterfaceMethodParameters.txt b/java/java-tests/testData/psi/cls/stubBuilder/InterfaceMethodParameters.txt new file mode 100644 index 000000000000..cf2ad366918c --- /dev/null +++ b/java/java-tests/testData/psi/cls/stubBuilder/InterfaceMethodParameters.txt @@ -0,0 +1,17 @@ +PsiJavaFileStub [] + PsiClassStub[interface name=IParams fqn=IParams] + PsiModifierListStub[mask=1025] + PsiTypeParameterListStub + PsiRefListStub[EXTENDS_LIST:] + PsiRefListStub[IMPLEMENTS_LIST:] + PsiMethodStub[m:void] + PsiModifierListStub[mask=1025] + PsiTypeParameterListStub + PsiParameterListStub + PsiParameterStub[first:int] + PsiModifierListStub[mask=0] + PsiParameterStub[second:java.lang.String] + PsiModifierListStub[mask=0] + PsiParameterStub[last:java.lang.Boolean] + PsiModifierListStub[mask=0] + PsiRefListStub[THROWS_LIST:] \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/psi/ClsStubBuilderTest.java b/java/java-tests/testSrc/com/intellij/java/psi/ClsStubBuilderTest.java index 97d192c41128..8a3c6b569eef 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/ClsStubBuilderTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/ClsStubBuilderTest.java @@ -43,6 +43,8 @@ public class ClsStubBuilderTest extends LightIdeaTestCase { public void testDoubleTest() { doTest(); /* IDEA-53195 */ } public void testAnnotatedNonStaticInnerClassConstructor() { doTest(); } public void testAnnotatedEnumConstructor() { doTest(); } + public void testInterfaceMethodParameters() { doTest(); } + public void testEnumMethodParameters() { doTest(); } public void testModifiers() { String clsFilePath = JavaTestUtil.getJavaTestDataPath() + "/psi/cls/repo/pack/" + getTestName(false) + ".class";