diagnostics for EA-76351 - IVFAE: VirtualDirectoryImpl.getChildren

This commit is contained in:
peter
2017-09-02 16:43:16 +02:00
parent 1b9fa21a78
commit 0520a3e223
2 changed files with 21 additions and 3 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.psi;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.impl.PackageDirectoryCache;
@@ -47,6 +48,7 @@ import java.util.Set;
* @author peter
*/
public abstract class NonClasspathClassFinder extends PsiElementFinder {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.NonClasspathClassFinder");
private static final EverythingGlobalScope ALL_SCOPE = new EverythingGlobalScope();
protected final Project myProject;
private volatile PackageDirectoryCache myCache;
@@ -71,7 +73,13 @@ public abstract class NonClasspathClassFinder extends PsiElementFinder {
protected PackageDirectoryCache getCache(@Nullable GlobalSearchScope scope) {
PackageDirectoryCache cache = myCache;
if (cache == null) {
myCache = cache = createCache(calcClassRoots());
List<VirtualFile> roots = calcClassRoots();
List<VirtualFile> invalidRoots = ContainerUtil.filter(roots, f -> !f.isValid());
if (!invalidRoots.isEmpty()) {
roots.removeAll(invalidRoots);
LOG.error("Invalid roots returned by " + getClass() + ": " + invalidRoots);
}
myCache = cache = createCache(roots);
}
return cache;
}
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.roots.impl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.util.NotNullLazyValue;
import com.intellij.openapi.util.VolatileNotNullLazyValue;
@@ -32,12 +33,21 @@ import java.util.*;
* @author peter
*/
public class PackageDirectoryCache {
private final MultiMap<String, VirtualFile> myRootsByPackagePrefix;
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.impl.PackageDirectoryCache");
private final MultiMap<String, VirtualFile> myRootsByPackagePrefix = MultiMap.create();
private final Map<String, PackageInfo> myDirectoriesByPackageNameCache = ContainerUtil.newConcurrentMap();
private final Set<String> myNonExistentPackages = ContainerUtil.newConcurrentSet();
public PackageDirectoryCache(@NotNull MultiMap<String, VirtualFile> rootsByPackagePrefix) {
myRootsByPackagePrefix = rootsByPackagePrefix;
for (String prefix : rootsByPackagePrefix.keySet()) {
for (VirtualFile file : rootsByPackagePrefix.get(prefix)) {
if (!file.isValid()) {
LOG.error("Invalid root: " + file);
} else {
myRootsByPackagePrefix.putValue(prefix, file);
}
}
}
}
public void onLowMemory() {