From a24681a5cc309e538e6abd71551d6387ddce4bd4 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 2 Nov 2012 21:43:25 +0100 Subject: [PATCH] EA-40568 (skip incorrect parameter names) --- .../impl/compiled/ClassFileStubBuilder.java | 2 +- .../psi/impl/compiled/ClsIdentifierImpl.java | 6 +--- .../psi/impl/compiled/ClsParsingUtil.java | 6 ++++ .../impl/compiled/StubBuildingVisitor.java | 27 ++++++++------- .../testData/psi/cls/mirror/EA40568.txt | 31 ++++++++++++++++++ .../testData/psi/cls/mirror/pkg/EA40568.class | Bin 0 -> 1482 bytes .../intellij/psi/ClsMirrorBuildingTest.java | 1 + 7 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 java/java-tests/testData/psi/cls/mirror/EA40568.txt create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/EA40568.class diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java index c26c9a015cc2..31d072063e16 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java @@ -52,6 +52,6 @@ public class ClassFileStubBuilder implements BinaryFileStubBuilder { @Override public int getStubVersion() { - return JavaFileElementType.STUB_VERSION + 4; + return JavaFileElementType.STUB_VERSION + 5; } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsIdentifierImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsIdentifierImpl.java index c6306488d385..a5f9b1c1ff39 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsIdentifierImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsIdentifierImpl.java @@ -15,8 +15,6 @@ */ package com.intellij.psi.impl.compiled; -import com.intellij.lexer.JavaLexer; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.TreeElement; import com.intellij.psi.tree.IElementType; @@ -53,9 +51,7 @@ class ClsIdentifierImpl extends ClsElementImpl implements PsiIdentifier, PsiJava } private boolean isCorrectName(String name) { - return name != null && - StringUtil.isJavaIdentifier(name) && - !JavaLexer.isKeyword(name, ((PsiJavaFile)getContainingFile()).getLanguageLevel()); + return name != null && ClsParsingUtil.isJavaIdentifier(name, ((PsiJavaFile)getContainingFile()).getLanguageLevel()); } @Override diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsParsingUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsParsingUtil.java index 16859f5608f7..e3a27d810d8f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsParsingUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsParsingUtil.java @@ -18,7 +18,9 @@ package com.intellij.psi.impl.compiled; import com.intellij.lang.PsiBuilder; import com.intellij.lang.java.parser.JavaParser; import com.intellij.lang.java.parser.JavaParserUtil; +import com.intellij.lexer.JavaLexer; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.impl.PsiJavaParserFacadeImpl; @@ -160,4 +162,8 @@ public class ClsParsingUtil { LOG.error("Unable to compute expression value: " + expr); return null; } + + public static boolean isJavaIdentifier(@NotNull String identifier, @NotNull LanguageLevel level) { + return StringUtil.isJavaIdentifier(identifier) && !JavaLexer.isKeyword(identifier, level); + } } 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 777c8e3af121..6405f7677a45 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 @@ -426,13 +426,8 @@ public class StubBuildingVisitor extends ClassVisitor { String[] thrownTypes = buildThrowsList(exceptions, throwables, parsedViaGenericSignature); new PsiClassReferenceListStubImpl(JavaStubElementTypes.THROWS_LIST, stub, thrownTypes, PsiReferenceList.Role.THROWS_LIST); - final boolean isEnumConstructor = isConstructor && myResult.isEnum(); - - int localVarIgnoreCount = (access & Opcodes.ACC_STATIC) != 0 ? 0 : 1; - if (isEnumConstructor) { - localVarIgnoreCount += 2; - } - final int paramIgnoreCount = isEnumConstructor? 2 : isNonStaticInnerClassConstructor ? 1 : 0; + final int localVarIgnoreCount = (access & Opcodes.ACC_STATIC) != 0 ? 0 : isConstructor && myResult.isEnum() ? 3 : 1; + final int paramIgnoreCount = isConstructor && myResult.isEnum() ? 2 : isNonStaticInnerClassConstructor ? 1 : 0; return new AnnotationParamCollectingVisitor(stub, modList, localVarIgnoreCount, paramIgnoreCount, paramCount, paramStubs); } @@ -610,10 +605,10 @@ public class StubBuildingVisitor extends ClassVisitor { private AnnotationParamCollectingVisitor(final PsiMethodStub owner, final PsiModifierListStub modList, - int ignoreCount, - int paramIgnoreCount, - int paramCount, - PsiParameterStubImpl[] paramStubs) { + final int ignoreCount, + final int paramIgnoreCount, + final int paramCount, + final PsiParameterStubImpl[] paramStubs) { super(Opcodes.ASM4); myOwner = owner; myModList = modList; @@ -649,10 +644,14 @@ public class StubBuildingVisitor extends ClassVisitor { // long and double variables increase the index by 2, not by 1 int paramIndex = (index - myIgnoreCount == myUsedParamSize) ? myUsedParamCount : index - myIgnoreCount; if (paramIndex >= myParamCount) return; - PsiParameterStubImpl parameterStub = myParamStubs[paramIndex]; - if (parameterStub != null) { - parameterStub.setName(name); + + if (ClsParsingUtil.isJavaIdentifier(name, LanguageLevel.HIGHEST)) { + PsiParameterStubImpl parameterStub = myParamStubs[paramIndex]; + if (parameterStub != null) { + parameterStub.setName(name); + } } + myUsedParamCount = paramIndex+1; if ("D".equals(desc) || "J".equals(desc)) { myUsedParamSize += 2; diff --git a/java/java-tests/testData/psi/cls/mirror/EA40568.txt b/java/java-tests/testData/psi/cls/mirror/EA40568.txt new file mode 100644 index 000000000000..6b82d8193207 --- /dev/null +++ b/java/java-tests/testData/psi/cls/mirror/EA40568.txt @@ -0,0 +1,31 @@ + + // IntelliJ API Decompiler stub source generated from a class file + // Implementation of methods is not available + +package com.google.android.maps; + +public class OverlayItem { + protected final com.google.android.maps.GeoPoint mPoint; + protected final java.lang.String mTitle; + protected final java.lang.String mSnippet; + protected android.graphics.drawable.Drawable mMarker; + public static final int ITEM_STATE_FOCUSED_MASK = 4; + public static final int ITEM_STATE_SELECTED_MASK = 2; + public static final int ITEM_STATE_PRESSED_MASK = 1; + + public OverlayItem(com.google.android.maps.GeoPoint geoPoint, java.lang.String s, java.lang.String s1) { /* compiled code */ } + + public void setMarker(android.graphics.drawable.Drawable drawable) { /* compiled code */ } + + public android.graphics.drawable.Drawable getMarker(int i) { /* compiled code */ } + + public static void setState(android.graphics.drawable.Drawable drawable, int i) { /* compiled code */ } + + public java.lang.String getTitle() { /* compiled code */ } + + public java.lang.String getSnippet() { /* compiled code */ } + + public com.google.android.maps.GeoPoint getPoint() { /* compiled code */ } + + public java.lang.String routableAddress() { /* compiled code */ } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/EA40568.class b/java/java-tests/testData/psi/cls/mirror/pkg/EA40568.class new file mode 100644 index 0000000000000000000000000000000000000000..72b32fd5b996be1fb0459a27868bb43140437774 GIT binary patch literal 1482 zcmbtU+l~@J5IqgZO;%Q9uikgj1y`Mz_@*%->}ZG}n;j(ai8M@S=-s)HnP$~5Gtorf z{U~G22r>qZY5s~GlL{~~%Nya@9wM0cgK1w*MdXET&9 zU5jqBj^WDjSP)yrX>faa&xQ3lPHnB@sHIf0tVN~5r zH0La22(-`+gs-)Q8hNJi%Ol-#flxE4530*(9hRN5;!(}oGI8|2l*>?D(fe1IO4ST= zWhvKmYRc8xq6iFmLj0bb5I!Br3c;5c%A)U0R5(v{)AU6^60S8oH&EPFJ#J5^+El|c zqoMVN-0pE-hUji+7>X_FiZ>I7#EnjH7YU?jWHKn@64JCQ(>@!mxoAxxkIUrmpnx?n zJfM97SI95M{B`oL#{3e+GJ5VZ*+YtWie!{0{{@@xO52}s{aeKIkZgf4pe#3Vlh#M{ zrK6Jy*;}|BV@QO!3o_iH9_KY&oFRuj?61T?zXjZjF+|;7u#5XEGaR70VhyzwYrs!x CelmXm literal 0 HcmV?d00001 diff --git a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java index 22dded44ebab..54d2d87760ca 100644 --- a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java @@ -37,6 +37,7 @@ public class ClsMirrorBuildingTest extends LightIdeaTestCase { public void testExtMethods() { doTest(); } public void testMethodReceiver() { doTest(); } public void testPackageInfo() { doTest("package-info"); } + public void testEA40568() { doTest(); } private void doTest() { doTest(getTestName(false));