diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java index 4a5b671d2bc..dfd9012843f 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java @@ -17,15 +17,21 @@ package org.jetbrains.jet.lang.resolve.java; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiModifier; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * Class static of instance members. @@ -34,7 +40,6 @@ import java.util.*; */ public class JavaClassMembersScope extends JavaClassOrPackageScope { private final Map classifiers = Maps.newHashMap(); - private Collection allDescriptors; public JavaClassMembersScope( @NotNull JavaSemanticServices semanticServices, @@ -73,25 +78,6 @@ public class JavaClassMembersScope extends JavaClassOrPackageScope { return Collections.emptySet(); } - /** - * @see JavaPackageScope#getAllDescriptors() - */ - @NotNull - @Override - public Collection getAllDescriptors() { - if (allDescriptors == null) { - allDescriptors = Sets.newHashSet(); - - allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData)); - - allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(resolverScopeData)); - - allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveInnerClasses( - resolverScopeData.classOrNamespaceDescriptor, resolverScopeData.psiClass, resolverScopeData.staticMembers)); - } - return allDescriptors; - } - private ClassifierDescriptor doGetClassifierDescriptor(String name) { // TODO : suboptimal, walk the list only once for (PsiClass innerClass : resolverScopeData.psiClass.getAllInnerClasses()) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java index e28e4892e2c..705d86fb3e9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassOrPackageScope.java @@ -16,15 +16,22 @@ package org.jetbrains.jet.lang.resolve.java; +import com.google.common.collect.Sets; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; +import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl; +import java.util.Collection; import java.util.Set; /** @@ -37,6 +44,9 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl { @NotNull protected final JavaDescriptorResolver.ResolverScopeData resolverScopeData; + // cache + private Collection allDescriptors; + protected JavaClassOrPackageScope( @NotNull JavaSemanticServices semanticServices, @NotNull JavaDescriptorResolver.ResolverScopeData resolverScopeData) { @@ -62,4 +72,58 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl { return semanticServices.getDescriptorResolver().resolveFunctionGroup(name, resolverScopeData); } + @NotNull + @Override + public Collection getAllDescriptors() { + if (allDescriptors == null) { + allDescriptors = Sets.newHashSet(); + + if (resolverScopeData.psiClass != null) { + allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData)); + + allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(resolverScopeData)); + + allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveInnerClasses( + resolverScopeData.classOrNamespaceDescriptor, resolverScopeData.psiClass, resolverScopeData.staticMembers)); + } + + if (resolverScopeData.psiPackage != null) { + boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(resolverScopeData.fqName) != null; + final JavaDescriptorResolver descriptorResolver = semanticServices.getDescriptorResolver(); + + for (PsiPackage psiSubPackage : resolverScopeData.psiPackage.getSubPackages()) { + NamespaceDescriptor childNs = descriptorResolver.resolveNamespace( + new FqName(psiSubPackage.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN); + if (childNs != null) { + allDescriptors.add(childNs); + } + } + + for (PsiClass psiClass : resolverScopeData.psiPackage.getClasses()) { + if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) { + continue; + } + + if (psiClass instanceof JetJavaMirrorMarker) { + continue; + } + + // TODO: Temp hack for collection function descriptors from java + if (JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) { + continue; + } + + if (psiClass.hasModifierProperty(PsiModifier.PUBLIC)) { + ClassDescriptor classDescriptor = descriptorResolver + .resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN); + if (classDescriptor != null) { + allDescriptors.add(classDescriptor); + } + } + } + } + } + + return allDescriptors; + } } 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 5652d9b2e69..5504e14bcca 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 @@ -204,14 +204,29 @@ public class JavaDescriptorResolver { @Nullable final PsiClass psiClass; + @Nullable + final PsiPackage psiPackage; + @NotNull + final FqName fqName; final boolean staticMembers; @NotNull final ClassOrNamespaceDescriptor classOrNamespaceDescriptor; - protected ResolverScopeData(@Nullable PsiClass psiClass, boolean staticMembers, @NotNull ClassOrNamespaceDescriptor descriptor) { + protected ResolverScopeData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, boolean staticMembers, @NotNull ClassOrNamespaceDescriptor descriptor) { checkPsiClassIsNotJet(psiClass); this.psiClass = psiClass; + this.psiPackage = psiPackage; + this.fqName = fqName; + + if (psiClass == null && psiPackage == null) { + throw new IllegalStateException("both psiClass and psiPackage cannot be null"); + } + + if (fqName.lastSegmentIs(JvmAbi.PACKAGE_CLASS)) { + throw new IllegalStateException("identified cannot have last segment " + JvmAbi.PACKAGE_CLASS + ": " + fqName); + } + this.staticMembers = staticMembers; classOrNamespaceDescriptor = descriptor; } @@ -226,8 +241,8 @@ public class JavaDescriptorResolver { static class ResolverBinaryClassData extends ResolverScopeData { private final MutableClassDescriptorLite classDescriptor; - ResolverBinaryClassData(@NotNull PsiClass psiClass, @NotNull MutableClassDescriptorLite classDescriptor) { - super(psiClass, false, classDescriptor); + ResolverBinaryClassData(@NotNull PsiClass psiClass, @NotNull FqName fqName, @NotNull MutableClassDescriptorLite classDescriptor) { + super(psiClass, null, fqName, false, classDescriptor); this.classDescriptor = classDescriptor; } @@ -250,8 +265,8 @@ public class JavaDescriptorResolver { static class ResolverNamespaceData extends ResolverScopeData { private final NamespaceDescriptor namespaceDescriptor; - ResolverNamespaceData(@Nullable PsiClass psiClass, @NotNull NamespaceDescriptor namespaceDescriptor) { - super(psiClass, true, namespaceDescriptor); + ResolverNamespaceData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, @NotNull NamespaceDescriptor namespaceDescriptor) { + super(psiClass, psiPackage, fqName, true, namespaceDescriptor); this.namespaceDescriptor = namespaceDescriptor; } @@ -340,7 +355,8 @@ public class JavaDescriptorResolver { } private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) { - if (classDescriptorCache.containsKey(new FqName(psiClass.getQualifiedName()))) { + FqName fqName = new FqName(psiClass.getQualifiedName()); + if (classDescriptorCache.containsKey(fqName)) { throw new IllegalStateException(psiClass.getQualifiedName()); } @@ -349,8 +365,8 @@ public class JavaDescriptorResolver { String name = psiClass.getName(); ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS; ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass); - ResolverBinaryClassData classData = new ResolverBinaryClassData(psiClass, new MutableClassDescriptorLite(containingDeclaration, kind)); - classDescriptorCache.put(new FqName(psiClass.getQualifiedName()), classData); + ResolverBinaryClassData classData = new ResolverBinaryClassData(psiClass, fqName, new MutableClassDescriptorLite(containingDeclaration, kind)); + classDescriptorCache.put(fqName, classData); classData.classDescriptor.setName(name); classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass)); @@ -518,9 +534,10 @@ public class JavaDescriptorResolver { checkPsiClassIsNotJet(psiClass); - ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, new MutableClassDescriptorLite(containing, ClassKind.OBJECT)); + FqName fqName = new FqName(classObjectPsiClass.getQualifiedName()); + ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, fqName, new MutableClassDescriptorLite(containing, ClassKind.OBJECT)); - classDescriptorCache.put(new FqName(classObjectPsiClass.getQualifiedName()), classData); + classDescriptorCache.put(fqName, classData); classData.kotlin = true; classData.classDescriptor.setSupertypes(getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData.classDescriptor, new ArrayList(0))); @@ -913,9 +930,9 @@ public class JavaDescriptorResolver { trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, ns, false); } - ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, ns); + ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, psiPackage, fqName, ns); - JavaPackageScope scope = new JavaPackageScope(fqName, semanticServices, psiPackage, psiClass, namespaceData); + JavaPackageScope scope = new JavaPackageScope(fqName, semanticServices, namespaceData); // TODO: hack namespaceData.kotlin = true; @@ -973,14 +990,15 @@ public class JavaDescriptorResolver { checkPsiClassIsNotJet(psiClass); + FqName fqName = new FqName(psiClass.getQualifiedName()); JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor( (NamespaceDescriptorParent) resolveParentDescriptor(psiClass), Collections.emptyList(), // TODO psiClass.getName(), - new FqName(psiClass.getQualifiedName()), + fqName, false ); - ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, ns); + ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, null, fqName, ns); trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, namespaceData.namespaceDescriptor, true); ns.setMemberScope(new JavaClassMembersScope(semanticServices, namespaceData)); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java index 360f460ed83..cd14e989872 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java @@ -38,24 +38,13 @@ public class JavaPackageScope extends JavaClassOrPackageScope { @NotNull private final FqName packageFQN; - @Nullable - private final PsiPackage psiPackage; - - private Collection allDescriptors; public JavaPackageScope( @NotNull FqName packageFQN, @NotNull JavaSemanticServices semanticServices, - @Nullable PsiPackage psiPackage, - @Nullable PsiClass psiClass, @NotNull JavaDescriptorResolver.ResolverScopeData resolverNamespaceData) { super(semanticServices, resolverNamespaceData); this.packageFQN = packageFQN; - this.psiPackage = psiPackage; - - if (psiClass == null && psiPackage == null) { - throw new IllegalStateException("both class and package cannot be null for " + packageFQN); - } } @Override @@ -80,59 +69,4 @@ public class JavaPackageScope extends JavaClassOrPackageScope { public NamespaceDescriptor getNamespace(@NotNull String name) { return semanticServices.getDescriptorResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN); } - - /** - * @see JavaClassMembersScope#getAllDescriptors() - */ - @NotNull - @Override - public Collection getAllDescriptors() { - if (allDescriptors == null) { - allDescriptors = Sets.newHashSet(); - - if (resolverScopeData.psiClass != null) { - allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData)); - - allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(resolverScopeData)); - } - - if (psiPackage != null) { - boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(packageFQN) != null; - final JavaDescriptorResolver descriptorResolver = semanticServices.getDescriptorResolver(); - - for (PsiPackage psiSubPackage : psiPackage.getSubPackages()) { - NamespaceDescriptor childNs = descriptorResolver.resolveNamespace( - new FqName(psiSubPackage.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN); - if (childNs != null) { - allDescriptors.add(childNs); - } - } - - for (PsiClass psiClass : psiPackage.getClasses()) { - if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) { - continue; - } - - if (psiClass instanceof JetJavaMirrorMarker) { - continue; - } - - // TODO: Temp hack for collection function descriptors from java - if (JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) { - continue; - } - - if (psiClass.hasModifierProperty(PsiModifier.PUBLIC)) { - ClassDescriptor classDescriptor = descriptorResolver - .resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN); - if (classDescriptor != null) { - allDescriptors.add(classDescriptor); - } - } - } - } - } - - return allDescriptors; - } }