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 000000000000..2b8d6b3ca145 Binary files /dev/null and b/java/java-tests/testData/psi/cls/stubBuilder/EnumMethodParameters.class differ diff --git a/java/java-tests/testData/psi/cls/stubBuilder/EnumMethodParameters.txt b/java/java-tests/testData/psi/cls/stubBuilder/EnumMethodParameters.txt new file mode 100644 index 000000000000..f1a7ddc675eb --- /dev/null +++ b/java/java-tests/testData/psi/cls/stubBuilder/EnumMethodParameters.txt @@ -0,0 +1,19 @@ +PsiJavaFileStub [] + PsiClassStub[enum name=EParams fqn=EParams] + PsiModifierListStub[mask=17] + PsiTypeParameterListStub + PsiRefListStub[EXTENDS_LIST:] + PsiRefListStub[IMPLEMENTS_LIST:] + PsiFieldStub[enumconst C:EParams] + PsiModifierListStub[mask=25] + PsiMethodStub[cons EParams:void] + PsiModifierListStub[mask=2] + 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/testData/psi/cls/stubBuilder/InterfaceMethodParameters.class b/java/java-tests/testData/psi/cls/stubBuilder/InterfaceMethodParameters.class new file mode 100644 index 000000000000..1324d98da59c Binary files /dev/null and b/java/java-tests/testData/psi/cls/stubBuilder/InterfaceMethodParameters.class differ 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";