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 7dcb272becf8..d2a66271353d 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 @@ -409,7 +409,8 @@ public class StubBuildingVisitor extends ClassVisitor { if (SYNTHETIC_CLASS_INIT_METHOD.equals(name)) return null; // skip semi-synthetic enum methods - if (myResult.isEnum()) { + boolean isEnum = myResult.isEnum(); + if (isEnum) { if ("values".equals(name) && desc.startsWith("()")) return null; if ("valueOf".equals(name) && desc.startsWith("(Ljava/lang/String;)")) return null; } @@ -423,9 +424,9 @@ public class StubBuildingVisitor extends ClassVisitor { final byte flags = PsiMethodStubImpl.packFlags(isConstructor, isAnnotationMethod, isVarargs, isDeprecated, false); - final String canonicalMethodName = isConstructor ? myResult.getName() : name; - final List args = new ArrayList(); - final List throwables = exceptions != null ? new ArrayList() : null; + String canonicalMethodName = isConstructor ? myResult.getName() : name; + List args = new ArrayList(); + List throwables = exceptions != null ? new ArrayList() : null; final PsiMethodStubImpl stub = new PsiMethodStubImpl(myResult, StringRef.fromString(canonicalMethodName), flags, null); @@ -446,6 +447,11 @@ public class StubBuildingVisitor extends ClassVisitor { stub.setReturnType(TypeInfo.fromString(returnType)); + if (isEnum && isConstructor && signature == null && args.size() >= 2 && JAVA_LANG_STRING.equals(args.get(0)) && "int".equals(args.get(1))) { + // exclude synthetic enum constructor parameters + args = args.subList(2, args.size()); + } + final boolean isNonStaticInnerClassConstructor = isConstructor && !(myParent instanceof PsiFileStub) && (myModList.getModifiersMask() & Opcodes.ACC_STATIC) == 0; final boolean shouldSkipFirstParamForNonStaticInnerClassConstructor = !parsedViaGenericSignature && isNonStaticInnerClassConstructor; @@ -469,8 +475,8 @@ public class StubBuildingVisitor extends ClassVisitor { String[] thrownTypes = buildThrowsList(exceptions, throwables, parsedViaGenericSignature); newReferenceList(JavaStubElementTypes.THROWS_LIST, stub, thrownTypes); - final int localVarIgnoreCount = (access & Opcodes.ACC_STATIC) != 0 ? 0 : isConstructor && myResult.isEnum() ? 3 : 1; - final int paramIgnoreCount = isConstructor && myResult.isEnum() ? 2 : isNonStaticInnerClassConstructor ? 1 : 0; + int localVarIgnoreCount = (access & Opcodes.ACC_STATIC) != 0 ? 0 : isConstructor && isEnum ? 3 : 1; + int paramIgnoreCount = isConstructor && isEnum ? 2 : isNonStaticInnerClassConstructor ? 1 : 0; return new AnnotationParamCollectingVisitor(stub, modList, localVarIgnoreCount, paramIgnoreCount, paramCount, paramStubs); } diff --git a/java/java-tests/testData/psi/cls/mirror/GrEnum.txt b/java/java-tests/testData/psi/cls/mirror/GrEnum.txt new file mode 100644 index 000000000000..f0c865f7d815 --- /dev/null +++ b/java/java-tests/testData/psi/cls/mirror/GrEnum.txt @@ -0,0 +1,15 @@ + + // IntelliJ API Decompiler stub source generated from a class file + // Implementation of methods is not available + +package pkg; + +public enum GrEnum implements groovy.lang.GroovyObject { + E1, E2; + + public final java.lang.String name; + public static final pkg.GrEnum MIN_VALUE; + public static final pkg.GrEnum MAX_VALUE; + + public GrEnum(java.lang.String _name) { /* compiled code */ } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/GrEnum.class b/java/java-tests/testData/psi/cls/mirror/pkg/GrEnum.class new file mode 100644 index 000000000000..7443ea347505 Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/GrEnum.class differ diff --git a/java/java-tests/testData/psi/cls/mirror/src/pkg/GrEnum.groovy b/java/java-tests/testData/psi/cls/mirror/src/pkg/GrEnum.groovy new file mode 100644 index 000000000000..a19034922343 --- /dev/null +++ b/java/java-tests/testData/psi/cls/mirror/src/pkg/GrEnum.groovy @@ -0,0 +1,11 @@ +package pkg + +enum GrEnum { + E1("e1"), E2("e2") + + public final String name + + GrEnum(String _name) { + name = _name + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java index a83d767918c8..b832e65c7675 100644 --- a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java @@ -53,6 +53,7 @@ public class ClsMirrorBuildingTest extends LightIdeaTestCase { public void testDefaultPackage() { doTest(); } public void testLocalClass() { doTest(); } public void testBounds() { doTest(); } + public void testGrEnum() { doTest(); } public void testTextPsiMismatch() { CommonCodeStyleSettings.IndentOptions options =