Simpler workaround for infinite recursion when obtaining Java sub packages.

This commit is contained in:
Evgeny Gerashchenko
2014-01-11 20:28:43 +04:00
parent cb78defa36
commit 5b7b0c5437
3 changed files with 16 additions and 36 deletions
@@ -101,37 +101,4 @@ public class JavaPsiFacadeKotlinHacks {
return null;
}
public PsiPackage[] getSubPackages(@NotNull PsiPackage psiPackage) {
GlobalSearchScope scope = GlobalSearchScope.allScope(psiPackage.getProject());
LinkedHashSet<PsiPackage> result = new LinkedHashSet<PsiPackage>();
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<String, PsiPackage> packagesMap = new HashMap<String, PsiPackage>();
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()]);
}
}
@@ -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<PsiPackage> implements Java
@Override
@NotNull
public Collection<JavaPackage> getSubPackages() {
PsiPackage psiPackage = getPsi();
return packages(new JavaPsiFacadeKotlinHacks(psiPackage.getProject()).getSubPackages(psiPackage));
return packages(getPsi().getSubPackages());
}
@Override