diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPsiFacadeKotlinHacks.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPsiFacadeKotlinHacks.java index 8c9cb77369b..78cb3cca134 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPsiFacadeKotlinHacks.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPsiFacadeKotlinHacks.java @@ -101,37 +101,4 @@ public class JavaPsiFacadeKotlinHacks { return null; } - - public PsiPackage[] getSubPackages(@NotNull PsiPackage psiPackage) { - GlobalSearchScope scope = GlobalSearchScope.allScope(psiPackage.getProject()); - - LinkedHashSet result = new LinkedHashSet(); - for (PsiElementFinder finder : extensionPsiElementFinders) { - PsiPackage[] packages = finder.getSubPackages(psiPackage, scope); - ContainerUtil.addAll(result, packages); - } - ContainerUtil.addAll(result, getDefaultSubPackages(psiPackage, scope)); - - return result.toArray(new PsiPackage[result.size()]); - } - - private static PsiPackage[] getDefaultSubPackages(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { - Map packagesMap = new HashMap(); - String qualifiedName = psiPackage.getQualifiedName(); - for (PsiDirectory dir : psiPackage.getDirectories(scope)) { - PsiDirectory[] subDirs = dir.getSubdirectories(); - for (PsiDirectory subDir : subDirs) { - PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(subDir); - if (aPackage != null) { - String subQualifiedName = aPackage.getQualifiedName(); - if (subQualifiedName.startsWith(qualifiedName) && !packagesMap.containsKey(subQualifiedName)) { - packagesMap.put(aPackage.getQualifiedName(), aPackage); - } - } - } - } - - packagesMap.remove(qualifiedName); // avoid SOE caused by returning a package as a subpackage of itself - return packagesMap.values().toArray(new PsiPackage[packagesMap.size()]); - } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaPackageImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaPackageImpl.java index 2fe35118b23..36acd62af93 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaPackageImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaPackageImpl.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve.java.structure.impl; import com.intellij.psi.PsiPackage; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -42,8 +41,7 @@ public class JavaPackageImpl extends JavaElementImpl implements Java @Override @NotNull public Collection getSubPackages() { - PsiPackage psiPackage = getPsi(); - return packages(new JavaPsiFacadeKotlinHacks(psiPackage.getProject()).getSubPackages(psiPackage)); + return packages(getPsi().getSubPackages()); } @Override diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPurePackageScope.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPurePackageScope.java index dfe51fbb350..b2f0cefadfa 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPurePackageScope.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPurePackageScope.java @@ -41,6 +41,9 @@ public final class JavaPurePackageScope extends JavaBaseScope implements JavaPac private final FqName packageFQN; private final boolean includeCompiledKotlinClasses; + private List subPackages = null; + private final Object subPackagesLock = new Object(); + public JavaPurePackageScope( @NotNull PackageFragmentDescriptor descriptor, @NotNull JavaPackage javaPackage, @@ -116,6 +119,18 @@ public final class JavaPurePackageScope extends JavaBaseScope implements JavaPac @Override @NotNull public Collection getSubPackages() { + synchronized (subPackagesLock) { + if (subPackages == null) { + subPackages = Lists.newArrayList(); // Initializing with empty list to avoid infinite recursion + + subPackages = computeSubPackages(); + } + return subPackages; + } + } + + @NotNull + private List computeSubPackages() { List result = Lists.newArrayList(); for (JavaPackage subPackage : javaPackage.getSubPackages()) { result.add(subPackage.getFqName());