Fix resolve of inner and nested classes in JavaDescriptorResolver

This commit is contained in:
Pavel V. Talanov
2012-11-11 14:34:06 +04:00
parent 96b48aedfc
commit 737b246b01
10 changed files with 54 additions and 25 deletions
@@ -16,7 +16,6 @@
package org.jetbrains.jet.lang.resolve.java; package org.jetbrains.jet.lang.resolve.java;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
@@ -172,7 +171,10 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
@NotNull @NotNull
public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) { public List<ClassDescriptor> resolveInnerClasses(
return innerClassResolver.resolveInnerClasses(owner, psiClass, staticMembers); @NotNull DeclarationDescriptor owner,
@NotNull ClassPsiDeclarationProvider declarationProvider)
{
return innerClassResolver.resolveInnerClasses(owner, declarationProvider);
} }
} }
@@ -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.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; 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 org.jetbrains.jet.lang.resolve.name.FqName;
import javax.inject.Inject; import javax.inject.Inject;
@@ -33,6 +34,8 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
public final class JavaInnerClassResolver { public final class JavaInnerClassResolver {
private JavaClassResolver classResolver; private JavaClassResolver classResolver;
@@ -46,20 +49,21 @@ public final class JavaInnerClassResolver {
} }
@NotNull @NotNull
public List<ClassDescriptor> resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, boolean staticMembers) { public List<ClassDescriptor> resolveInnerClasses(@NotNull DeclarationDescriptor owner,
if (staticMembers) { @NotNull ClassPsiDeclarationProvider declarationProvider) {
return resolveInnerClassesOfClassObject(owner, psiClass); if (declarationProvider.isStaticMembers() && declarationProvider.getDeclarationOrigin() == KOTLIN) {
return resolveInnerClassesOfClassObject(owner, declarationProvider.getPsiClass());
} }
return resolveInnerClasses(owner, psiClass); return resolveInnerClasses(owner, declarationProvider.getPsiClass(), declarationProvider.isStaticMembers());
} }
@NotNull @NotNull
private List<ClassDescriptor> resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass) { private List<ClassDescriptor> resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, boolean isStatic) {
PsiClass[] innerPsiClasses = psiClass.getInnerClasses(); PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(innerPsiClasses.length); List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
for (PsiClass innerPsiClass : innerPsiClasses) { for (PsiClass innerPsiClass : innerPsiClasses) {
if (shouldBeIgnored(owner, innerPsiClass)) { if (shouldBeIgnored(owner, innerPsiClass, isStatic)) {
continue; continue;
} }
ClassDescriptor classDescriptor = resolveInnerClass(innerPsiClass); ClassDescriptor classDescriptor = resolveInnerClass(innerPsiClass);
@@ -68,9 +72,10 @@ public final class JavaInnerClassResolver {
return result; 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 // TODO: hack against inner classes
return innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE) return innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)
|| innerPsiClass.hasModifierProperty(PsiModifier.STATIC) != isStatic
|| innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME) || innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)
|| DescriptorResolverUtils.isInnerEnum(innerPsiClass, owner); || DescriptorResolverUtils.isInnerEnum(innerPsiClass, owner);
} }
@@ -72,4 +72,10 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
} }
return classifiersMap; return classifiersMap;
} }
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {
return getResolver().resolveInnerClasses(descriptor, declarationProvider);
}
} }
@@ -47,10 +47,4 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
} }
return constructors; return constructors;
} }
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {
return getResolver().resolveInnerClasses(descriptor, declarationProvider.getPsiClass(), declarationProvider.isStaticMembers());
}
} }
@@ -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.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection;
public final class JavaClassStaticMembersScope extends JavaClassMembersScope { public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
@NotNull @NotNull
private final FqName packageFQN; private final FqName packageFQN;
@@ -51,10 +49,4 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
public NamespaceDescriptor getNamespace(@NotNull Name name) { public NamespaceDescriptor getNamespace(@NotNull Name name) {
return getResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN); return getResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN);
} }
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {
return getResolver().resolveInnerClasses(descriptor, declarationProvider.getPsiClass(), false);
}
} }
@@ -51,6 +51,6 @@ public final class JavaScopeForKotlinNamespace extends JavaPackageScope {
@NotNull @NotNull
@Override @Override
protected Collection<ClassDescriptor> computeInnerClasses() { protected Collection<ClassDescriptor> computeInnerClasses() {
return getResolver().resolveInnerClasses(descriptor, declarationProvider.getPsiClass(), false); return getResolver().resolveInnerClasses(descriptor, declarationProvider);
} }
} }
@@ -0,0 +1,11 @@
package test;
public class InnerClass {
public class Inner {
public void foo() {}
}
public static class Nested {
public void bar() {}
}
}
@@ -0,0 +1,9 @@
namespace test
public open class test.InnerClass : java.lang.Object {
public final /*constructor*/ fun <init>(): test.InnerClass
public open class test.InnerClass.Inner : java.lang.Object {
public final /*constructor*/ fun <init>(): test.InnerClass.Inner
public open fun foo(): jet.Tuple0
}
}
@@ -0,0 +1,6 @@
namespace InnerClass
public open class test.InnerClass.Nested : java.lang.Object {
public final /*constructor*/ fun <init>(): test.InnerClass.Nested
public open fun bar(): jet.Tuple0
}
@@ -42,6 +42,10 @@ public final class StaticMembersJavaDescriptorResolverTest extends AbstractJavaR
doTest(); doTest();
} }
public void testInnerClass() throws Exception {
doTest();
}
private void doTest() throws IOException { private void doTest() throws IOException {
String name = getTestName(false); String name = getTestName(false);
compileJavaFile(name + ".java"); compileJavaFile(name + ".java");