From 737b246b0182fd69c27075a9a4589f1d543a1ff1 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Sun, 11 Nov 2012 14:34:06 +0400 Subject: [PATCH] Fix resolve of inner and nested classes in JavaDescriptorResolver --- .../resolve/java/JavaDescriptorResolver.java | 8 +++++--- .../java/resolver/JavaInnerClassResolver.java | 19 ++++++++++++------- .../java/scope/JavaClassMembersScope.java | 6 ++++++ .../scope/JavaClassNonStaticMembersScope.java | 6 ------ .../scope/JavaClassStaticMembersScope.java | 8 -------- .../scope/JavaScopeForKotlinNamespace.java | 2 +- .../staticMembers/InnerClass.java | 11 +++++++++++ .../staticMembers/InnerClass_non_static.txt | 9 +++++++++ .../staticMembers/InnerClass_static.txt | 6 ++++++ ...aticMembersJavaDescriptorResolverTest.java | 4 ++++ 10 files changed, 54 insertions(+), 25 deletions(-) create mode 100644 compiler/testData/javaDescriptorResolver/staticMembers/InnerClass.java create mode 100644 compiler/testData/javaDescriptorResolver/staticMembers/InnerClass_non_static.txt create mode 100644 compiler/testData/javaDescriptorResolver/staticMembers/InnerClass_static.txt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index fead3423353..bcd4293a92b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.lang.resolve.java; -import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -172,7 +171,10 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes } @NotNull - public List resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) { - return innerClassResolver.resolveInnerClasses(owner, psiClass, staticMembers); + public List resolveInnerClasses( + @NotNull DeclarationDescriptor owner, + @NotNull ClassPsiDeclarationProvider declarationProvider) + { + return innerClassResolver.resolveInnerClasses(owner, declarationProvider); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaInnerClassResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaInnerClassResolver.java index ee81e156db0..6e6a758684e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaInnerClassResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaInnerClassResolver.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.name.FqName; import javax.inject.Inject; @@ -33,6 +34,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN; + public final class JavaInnerClassResolver { private JavaClassResolver classResolver; @@ -46,20 +49,21 @@ public final class JavaInnerClassResolver { } @NotNull - public List resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, boolean staticMembers) { - if (staticMembers) { - return resolveInnerClassesOfClassObject(owner, psiClass); + public List resolveInnerClasses(@NotNull DeclarationDescriptor owner, + @NotNull ClassPsiDeclarationProvider declarationProvider) { + if (declarationProvider.isStaticMembers() && declarationProvider.getDeclarationOrigin() == KOTLIN) { + return resolveInnerClassesOfClassObject(owner, declarationProvider.getPsiClass()); } - return resolveInnerClasses(owner, psiClass); + return resolveInnerClasses(owner, declarationProvider.getPsiClass(), declarationProvider.isStaticMembers()); } @NotNull - private List resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass) { + private List resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, boolean isStatic) { PsiClass[] innerPsiClasses = psiClass.getInnerClasses(); List result = new ArrayList(innerPsiClasses.length); for (PsiClass innerPsiClass : innerPsiClasses) { - if (shouldBeIgnored(owner, innerPsiClass)) { + if (shouldBeIgnored(owner, innerPsiClass, isStatic)) { continue; } ClassDescriptor classDescriptor = resolveInnerClass(innerPsiClass); @@ -68,9 +72,10 @@ public final class JavaInnerClassResolver { return result; } - private static boolean shouldBeIgnored(DeclarationDescriptor owner, PsiClass innerPsiClass) { + private static boolean shouldBeIgnored(DeclarationDescriptor owner, PsiClass innerPsiClass, boolean isStatic) { // TODO: hack against inner classes return innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE) + || innerPsiClass.hasModifierProperty(PsiModifier.STATIC) != isStatic || innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME) || DescriptorResolverUtils.isInnerEnum(innerPsiClass, owner); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java index 8c9e4be0989..1cbdf128b01 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java @@ -72,4 +72,10 @@ public abstract class JavaClassMembersScope extends JavaBaseScope { } return classifiersMap; } + + @NotNull + @Override + protected Collection computeInnerClasses() { + return getResolver().resolveInnerClasses(descriptor, declarationProvider); + } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java index ef688f7025d..05c931ada09 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java @@ -47,10 +47,4 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope } return constructors; } - - @NotNull - @Override - protected Collection computeInnerClasses() { - return getResolver().resolveInnerClasses(descriptor, declarationProvider.getPsiClass(), declarationProvider.isStaticMembers()); - } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java index 7fbc2cb5cd8..870a5ff3aea 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java @@ -25,8 +25,6 @@ import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; -import java.util.Collection; - public final class JavaClassStaticMembersScope extends JavaClassMembersScope { @NotNull private final FqName packageFQN; @@ -51,10 +49,4 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope { public NamespaceDescriptor getNamespace(@NotNull Name name) { return getResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN); } - - @NotNull - @Override - protected Collection computeInnerClasses() { - return getResolver().resolveInnerClasses(descriptor, declarationProvider.getPsiClass(), false); - } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaScopeForKotlinNamespace.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaScopeForKotlinNamespace.java index 529651f314d..df626ac40ad 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaScopeForKotlinNamespace.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaScopeForKotlinNamespace.java @@ -51,6 +51,6 @@ public final class JavaScopeForKotlinNamespace extends JavaPackageScope { @NotNull @Override protected Collection computeInnerClasses() { - return getResolver().resolveInnerClasses(descriptor, declarationProvider.getPsiClass(), false); + return getResolver().resolveInnerClasses(descriptor, declarationProvider); } } diff --git a/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass.java b/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass.java new file mode 100644 index 00000000000..755ea151b9f --- /dev/null +++ b/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass.java @@ -0,0 +1,11 @@ +package test; + +public class InnerClass { + public class Inner { + public void foo() {} + } + + public static class Nested { + public void bar() {} + } +} \ No newline at end of file diff --git a/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass_non_static.txt b/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass_non_static.txt new file mode 100644 index 00000000000..593ed9c9c1d --- /dev/null +++ b/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass_non_static.txt @@ -0,0 +1,9 @@ +namespace test + +public open class test.InnerClass : java.lang.Object { + public final /*constructor*/ fun (): test.InnerClass + public open class test.InnerClass.Inner : java.lang.Object { + public final /*constructor*/ fun (): test.InnerClass.Inner + public open fun foo(): jet.Tuple0 + } +} diff --git a/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass_static.txt b/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass_static.txt new file mode 100644 index 00000000000..e06bffebef5 --- /dev/null +++ b/compiler/testData/javaDescriptorResolver/staticMembers/InnerClass_static.txt @@ -0,0 +1,6 @@ +namespace InnerClass + +public open class test.InnerClass.Nested : java.lang.Object { + public final /*constructor*/ fun (): test.InnerClass.Nested + public open fun bar(): jet.Tuple0 +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/StaticMembersJavaDescriptorResolverTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/StaticMembersJavaDescriptorResolverTest.java index e46aba91bb4..789cbbd9897 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/StaticMembersJavaDescriptorResolverTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/StaticMembersJavaDescriptorResolverTest.java @@ -42,6 +42,10 @@ public final class StaticMembersJavaDescriptorResolverTest extends AbstractJavaR doTest(); } + public void testInnerClass() throws Exception { + doTest(); + } + private void doTest() throws IOException { String name = getTestName(false); compileJavaFile(name + ".java");