From a375d1e7fa27aeca99a6799addb8ebc4277549cc Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 3 Jun 2014 15:01:12 +0400 Subject: [PATCH] java: correct stub for enums compiled by Groovy --- .../impl/compiled/StubBuildingVisitor.java | 18 ++++++++++++------ .../testData/psi/cls/mirror/GrEnum.txt | 15 +++++++++++++++ .../testData/psi/cls/mirror/pkg/GrEnum.class | Bin 0 -> 6981 bytes .../psi/cls/mirror/src/pkg/GrEnum.groovy | 11 +++++++++++ .../intellij/psi/ClsMirrorBuildingTest.java | 1 + 5 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/psi/cls/mirror/GrEnum.txt create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/GrEnum.class create mode 100644 java/java-tests/testData/psi/cls/mirror/src/pkg/GrEnum.groovy 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 0000000000000000000000000000000000000000..7443ea3475054492e8f33a924a85ca89446f534f GIT binary patch literal 6981 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 H90UIY0;u${ literal 0 HcmV?d00001 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 =