Simpler workaround for infinite recursion when obtaining Java sub packages.
This commit is contained in:
-33
@@ -101,37 +101,4 @@ public class JavaPsiFacadeKotlinHacks {
|
|||||||
|
|
||||||
return null;
|
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()]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve.java.structure.impl;
|
|||||||
|
|
||||||
import com.intellij.psi.PsiPackage;
|
import com.intellij.psi.PsiPackage;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.JavaClass;
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
@@ -42,8 +41,7 @@ public class JavaPackageImpl extends JavaElementImpl<PsiPackage> implements Java
|
|||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public Collection<JavaPackage> getSubPackages() {
|
public Collection<JavaPackage> getSubPackages() {
|
||||||
PsiPackage psiPackage = getPsi();
|
return packages(getPsi().getSubPackages());
|
||||||
return packages(new JavaPsiFacadeKotlinHacks(psiPackage.getProject()).getSubPackages(psiPackage));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+15
@@ -41,6 +41,9 @@ public final class JavaPurePackageScope extends JavaBaseScope implements JavaPac
|
|||||||
private final FqName packageFQN;
|
private final FqName packageFQN;
|
||||||
private final boolean includeCompiledKotlinClasses;
|
private final boolean includeCompiledKotlinClasses;
|
||||||
|
|
||||||
|
private List<FqName> subPackages = null;
|
||||||
|
private final Object subPackagesLock = new Object();
|
||||||
|
|
||||||
public JavaPurePackageScope(
|
public JavaPurePackageScope(
|
||||||
@NotNull PackageFragmentDescriptor descriptor,
|
@NotNull PackageFragmentDescriptor descriptor,
|
||||||
@NotNull JavaPackage javaPackage,
|
@NotNull JavaPackage javaPackage,
|
||||||
@@ -116,6 +119,18 @@ public final class JavaPurePackageScope extends JavaBaseScope implements JavaPac
|
|||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public Collection<FqName> getSubPackages() {
|
public Collection<FqName> getSubPackages() {
|
||||||
|
synchronized (subPackagesLock) {
|
||||||
|
if (subPackages == null) {
|
||||||
|
subPackages = Lists.newArrayList(); // Initializing with empty list to avoid infinite recursion
|
||||||
|
|
||||||
|
subPackages = computeSubPackages();
|
||||||
|
}
|
||||||
|
return subPackages;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private List<FqName> computeSubPackages() {
|
||||||
List<FqName> result = Lists.newArrayList();
|
List<FqName> result = Lists.newArrayList();
|
||||||
for (JavaPackage subPackage : javaPackage.getSubPackages()) {
|
for (JavaPackage subPackage : javaPackage.getSubPackages()) {
|
||||||
result.add(subPackage.getFqName());
|
result.add(subPackage.getFqName());
|
||||||
|
|||||||
Reference in New Issue
Block a user