From 2eb15039a4eea916df3511a148c8fd2497f73114 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 11 Mar 2013 15:23:18 +0400 Subject: [PATCH] Added namespace classes to Java static member scope. --- .../java/resolver/JavaNamespaceResolver.java | 25 +++++++++++++++++++ .../lang/resolve/java/scope/ScopeUtils.java | 11 ++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java index 2f089359e51..a064c1a70bd 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java @@ -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; + } } \ No newline at end of file diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/ScopeUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/ScopeUtils.java index 31f0fed2e48..b6b81cc8bfe 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/ScopeUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/ScopeUtils.java @@ -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; } + }