diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java index 94813d2c707..b87831b7958 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/DescriptorResolverUtils.java @@ -27,9 +27,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; import static com.intellij.psi.util.PsiFormatUtilBase.*; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClassObject; @@ -155,4 +153,20 @@ public final class DescriptorResolverUtils { method, PsiSubstitutor.EMPTY, SHOW_NAME | SHOW_PARAMETERS, SHOW_TYPE | SHOW_FQ_CLASS_NAMES); return OBJECT_METHODS.contains(formattedMethod); } + + @NotNull + public static Collection filterDuplicateClasses(@NotNull PsiClass[] classes) { + Set addedQualifiedNames = new HashSet(classes.length); + List result = new ArrayList(classes.length); + + for (PsiClass psiClass : classes) { + String qualifiedName = psiClass.getQualifiedName(); + + if (qualifiedName != null && addedQualifiedNames.add(qualifiedName)) { + result.add(psiClass); + } + } + + return result; + } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinder.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinder.java index b89b4be8ba6..e2721599a84 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinder.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinder.java @@ -22,8 +22,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.name.FqName; -import java.util.List; - public interface PsiClassFinder { enum RuntimeClassesHandleMode { REPORT_ERROR, @@ -35,10 +33,4 @@ public interface PsiClassFinder { @Nullable PsiPackage findPsiPackage(@NotNull FqName fqName); - - @NotNull - List findPsiClasses(@NotNull PsiPackage psiPackage); - - @NotNull - List findInnerPsiClasses(@NotNull PsiClass psiClass); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderImpl.java index 4b406d4b85f..7ac94db8a67 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderImpl.java @@ -16,8 +16,6 @@ package org.jetbrains.jet.lang.resolve.java; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -37,8 +35,6 @@ import org.jetbrains.jet.plugin.JetFileType; import javax.annotation.PostConstruct; import javax.inject.Inject; -import java.util.List; -import java.util.Set; public class PsiClassFinderImpl implements PsiClassFinder { private static final Logger LOG = Logger.getInstance(PsiClassFinderImpl.class); @@ -133,33 +129,4 @@ public class PsiClassFinderImpl implements PsiClassFinder { public PsiPackage findPsiPackage(@NotNull FqName qualifiedName) { return javaFacade.findPackage(qualifiedName.asString()); } - - @NotNull - @Override - public List findPsiClasses(@NotNull PsiPackage psiPackage) { - return filterDuplicateClasses(psiPackage.getClasses()); - } - - @NotNull - @Override - public List findInnerPsiClasses(@NotNull PsiClass psiClass) { - return filterDuplicateClasses(psiClass.getInnerClasses()); - } - - private static List filterDuplicateClasses(PsiClass[] classes) { - Set addedQualifiedNames = Sets.newHashSet(); - List filteredClasses = Lists.newArrayList(); - - for (PsiClass aClass : classes) { - String qualifiedName = aClass.getQualifiedName(); - - if (qualifiedName != null) { - if (addedQualifiedNames.add(qualifiedName)) { - filteredClasses.add(aClass); - } - } - } - - return filteredClasses; - } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java index 18dc5b6c122..00e181d2885 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java @@ -23,7 +23,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.JetJavaMirrorMarker; -import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiFieldWrapper; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMemberWrapper; @@ -32,7 +31,6 @@ import org.jetbrains.jet.lang.resolve.name.Name; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; public final class MembersCache { @@ -91,7 +89,6 @@ public final class MembersCache { @NotNull public static MembersCache buildMembersByNameCache( - @NotNull PsiClassFinder finder, @Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, boolean staticMembers @@ -100,21 +97,23 @@ public final class MembersCache { if (psiClass != null) { membersCache.new ClassMemberProcessor(psiClass, staticMembers).process(); + Collection innerClasses = DescriptorResolverUtils.filterDuplicateClasses(psiClass.getInnerClasses()); + membersCache.new ExtraPackageMembersProcessor(innerClasses).process(); + } + else if (psiPackage != null) { + Collection classes = DescriptorResolverUtils.filterDuplicateClasses(psiPackage.getClasses()); + membersCache.new ExtraPackageMembersProcessor(classes).process(); } - - //TODO: - List classes = psiPackage != null ? finder.findPsiClasses(psiPackage) : finder.findInnerPsiClasses(psiClass); - membersCache.new ExtraPackageMembersProcessor(classes).process(); return membersCache; } private class ExtraPackageMembersProcessor { // 'extra' means that PSI elements for these members are not just top-level classes @NotNull - private final List psiClasses; + private final Collection psiClasses; - private ExtraPackageMembersProcessor(@NotNull List classes) { - psiClasses = classes; + private ExtraPackageMembersProcessor(@NotNull Collection psiClasses) { + this.psiClasses = psiClasses; } private void process() { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java index e7bab6a1c6c..aa0dc09bf4d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java @@ -297,8 +297,7 @@ public final class JavaClassResolver { classDescriptor.setModality(resolveModality(psiClass, classDescriptor)); classDescriptor.createTypeConstructor(); - JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classDescriptor, psiClass, false, psiClassFinder, - javaDescriptorResolver); + JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classDescriptor, psiClass, false, javaDescriptorResolver); classDescriptor.setScopeForMemberLookup(scope); classDescriptor.setScopeForConstructorResolve(scope); @@ -504,7 +503,7 @@ public final class JavaClassResolver { classObjectDescriptor.setTypeParameterDescriptors(Collections.emptyList()); classObjectDescriptor.createTypeConstructor(); - JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classObjectDescriptor, psiClass, true, psiClassFinder, + JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classObjectDescriptor, psiClass, true, javaDescriptorResolver); WritableScopeImpl writableScope = new WritableScopeImpl(scope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, "Member lookup scope"); 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 25ee78f7d18..696b1834d42 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 @@ -178,7 +178,7 @@ public final class JavaNamespaceResolver { trace.record(BindingContext.NAMESPACE, psiPackage, namespaceDescriptor); } - return new JavaPackageScope(namespaceDescriptor, psiPackage, fqName, javaDescriptorResolver, psiClassFinder); + return new JavaPackageScope(namespaceDescriptor, psiPackage, fqName, javaDescriptorResolver); } PsiClass psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE); @@ -198,7 +198,7 @@ public final class JavaNamespaceResolver { trace.record(BindingContext.NAMESPACE, psiClass, namespaceDescriptor); } - return new JavaClassStaticMembersScope(namespaceDescriptor, fqName, psiClass, psiClassFinder, javaDescriptorResolver); + return new JavaClassStaticMembersScope(namespaceDescriptor, fqName, psiClass, javaDescriptorResolver); } private void cache(@NotNull FqName fqName, @Nullable JetScope packageScope) { @@ -261,4 +261,4 @@ public final class JavaNamespaceResolver { return result; } -} \ No newline at end of file +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java index e52dfa4b901..e8d02e49e17 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java @@ -22,7 +22,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; -import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import org.jetbrains.jet.lang.resolve.name.FqName; import java.util.ArrayList; @@ -44,10 +43,9 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope @NotNull ClassDescriptor descriptor, @NotNull PsiClass psiClass, boolean staticMembersOfPsiClass, - @NotNull PsiClassFinder psiClassFinder, @NotNull JavaDescriptorResolver javaDescriptorResolver ) { - super(descriptor, psiClass, MembersProvider.forClass(psiClassFinder, psiClass, staticMembersOfPsiClass), javaDescriptorResolver); + super(descriptor, psiClass, MembersProvider.forClass(psiClass, staticMembersOfPsiClass), javaDescriptorResolver); this.descriptor = descriptor; this.staticMembersOfPsiClass = staticMembersOfPsiClass; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java index f1e46716825..2b6bd60d429 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java @@ -23,7 +23,6 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; -import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -40,10 +39,9 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope { @NotNull NamespaceDescriptor descriptor, @NotNull FqName packageFQN, @NotNull PsiClass psiClass, - @NotNull PsiClassFinder psiClassFinder, @NotNull JavaDescriptorResolver javaDescriptorResolver ) { - super(descriptor, psiClass, MembersProvider.forClass(psiClassFinder, psiClass, true), javaDescriptorResolver); + super(descriptor, psiClass, MembersProvider.forClass(psiClass, true), javaDescriptorResolver); this.packageFQN = packageFQN; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java index 693361d39af..11a899acff5 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java @@ -26,7 +26,6 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JetJavaMirrorMarker; -import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -43,20 +42,16 @@ public final class JavaPackageScope extends JavaBaseScope { private final PsiPackage psiPackage; @NotNull private final FqName packageFQN; - @NotNull - private final PsiClassFinder psiClassFinder; public JavaPackageScope( @NotNull NamespaceDescriptor descriptor, @NotNull PsiPackage psiPackage, @NotNull FqName packageFQN, - @NotNull JavaDescriptorResolver javaDescriptorResolver, - @NotNull PsiClassFinder psiClassFinder + @NotNull JavaDescriptorResolver javaDescriptorResolver ) { - super(descriptor, javaDescriptorResolver, MembersProvider.forPackage(psiClassFinder, psiPackage)); + super(descriptor, javaDescriptorResolver, MembersProvider.forPackage(psiPackage)); this.psiPackage = psiPackage; this.packageFQN = packageFQN; - this.psiClassFinder = psiClassFinder; } @Override @@ -102,7 +97,7 @@ public final class JavaPackageScope extends JavaBaseScope { } } - for (PsiClass psiClass : psiClassFinder.findPsiClasses(psiPackage)) { + for (PsiClass psiClass : DescriptorResolverUtils.filterDuplicateClasses(psiPackage.getClasses())) { if (DescriptorResolverUtils.isCompiledKotlinPackageClass(psiClass)) continue; if (psiClass instanceof JetJavaMirrorMarker) continue; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/MembersProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/MembersProvider.java index 20caf65513a..16d063e0467 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/MembersProvider.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/MembersProvider.java @@ -20,7 +20,6 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.resolve.java.PsiClassFinder; import org.jetbrains.jet.lang.resolve.java.provider.MembersCache; import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers; import org.jetbrains.jet.lang.resolve.name.Name; @@ -28,34 +27,26 @@ import org.jetbrains.jet.lang.resolve.name.Name; import java.util.Collection; /* package */ class MembersProvider { - @NotNull - private final PsiClassFinder psiClassFinder; @Nullable private final PsiClass psiClass; @Nullable private final PsiPackage psiPackage; private final boolean staticMembers; - private MembersProvider( - @NotNull PsiClassFinder psiClassFinder, - @Nullable PsiClass psiClass, - @Nullable PsiPackage psiPackage, - boolean staticMembers - ) { - this.psiClassFinder = psiClassFinder; + private MembersProvider(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, boolean staticMembers) { this.psiClass = psiClass; this.psiPackage = psiPackage; this.staticMembers = staticMembers; } @NotNull - public static MembersProvider forPackage(@NotNull PsiClassFinder psiClassFinder, @NotNull PsiPackage psiPackage) { - return new MembersProvider(psiClassFinder, null, psiPackage, true); + public static MembersProvider forPackage(@NotNull PsiPackage psiPackage) { + return new MembersProvider(null, psiPackage, true); } @NotNull - public static MembersProvider forClass(@NotNull PsiClassFinder psiClassFinder, @NotNull PsiClass psiClass, boolean staticMembers) { - return new MembersProvider(psiClassFinder, psiClass, null, staticMembers); + public static MembersProvider forClass(@NotNull PsiClass psiClass, boolean staticMembers) { + return new MembersProvider(psiClass, null, staticMembers); } @Nullable @@ -72,7 +63,7 @@ import java.util.Collection; @NotNull private MembersCache getMembersCache() { if (membersCache == null) { - membersCache = MembersCache.buildMembersByNameCache(psiClassFinder, psiClass, psiPackage, staticMembers); + membersCache = MembersCache.buildMembersByNameCache(psiClass, psiPackage, staticMembers); } return membersCache; }