Added namespace classes to Java static member scope.

This commit is contained in:
Evgeny Gerashchenko
2013-03-11 15:23:18 +04:00
parent 11dfcab3ca
commit 2eb15039a4
2 changed files with 34 additions and 2 deletions
@@ -19,7 +19,10 @@ package org.jetbrains.jet.lang.resolve.java.resolver;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiMember;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiPackage;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
@@ -170,6 +173,12 @@ public final class JavaNamespaceResolver {
// static members of enum class into class object descriptor
return null;
}
if (DescriptorResolverUtils.isKotlinClass(psiClass)) {
return null;
}
if (!hasStaticMembers(psiClass)) {
return null;
}
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.CLASS_STATICS);
return new JavaClassStaticMembersScope(
namespaceDescriptor,
@@ -207,4 +216,20 @@ public final class JavaNamespaceResolver {
private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
return psiClassFinder.findPsiClass(PackageClassUtils.getPackageClassFqName(packageFQN), PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
}
private static boolean hasStaticMembers(@NotNull PsiClass psiClass) {
for (PsiMember member : ContainerUtil.concat(psiClass.getMethods(), psiClass.getFields())) {
if (member.hasModifierProperty(PsiModifier.STATIC)) {
return true;
}
}
for (PsiClass nestedClass : psiClass.getInnerClasses()) {
if (nestedClass.hasModifierProperty(PsiModifier.STATIC) && hasStaticMembers(nestedClass)) {
return true;
}
}
return false;
}
}
@@ -61,13 +61,20 @@ public final class ScopeUtils {
if (psiClass.hasModifierProperty(PsiModifier.PUBLIC)) {
ProgressIndicatorProvider.checkCanceled();
ClassDescriptor classDescriptor = descriptorResolver
.resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
FqName fqName = new FqName(psiClass.getQualifiedName());
ClassDescriptor classDescriptor = descriptorResolver.resolveClass(fqName, DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
if (classDescriptor != null) {
result.add(classDescriptor);
}
NamespaceDescriptor namespaceDescriptor = descriptorResolver.resolveNamespace(
fqName, DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
if (namespaceDescriptor != null) {
result.add(namespaceDescriptor);
}
}
}
return result;
}
}