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;
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<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
return innerClassResolver.resolveInnerClasses(owner, psiClass, staticMembers);
public List<ClassDescriptor> resolveInnerClasses(
@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.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<ClassDescriptor> resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, boolean staticMembers) {
if (staticMembers) {
return resolveInnerClassesOfClassObject(owner, psiClass);
public List<ClassDescriptor> 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<ClassDescriptor> resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass) {
private List<ClassDescriptor> resolveInnerClasses(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, boolean isStatic) {
PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(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);
}
@@ -72,4 +72,10 @@ public abstract class JavaClassMembersScope extends JavaBaseScope {
}
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;
}
@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.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<ClassDescriptor> computeInnerClasses() {
return getResolver().resolveInnerClasses(descriptor, declarationProvider.getPsiClass(), false);
}
}
@@ -51,6 +51,6 @@ public final class JavaScopeForKotlinNamespace extends JavaPackageScope {
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {
return getResolver().resolveInnerClasses(descriptor, declarationProvider.getPsiClass(), false);
return getResolver().resolveInnerClasses(descriptor, declarationProvider);
}
}