From 0520a3e22370e40bd3f0b90ef31576e80cf37692 Mon Sep 17 00:00:00 2001 From: peter Date: Sat, 2 Sep 2017 16:43:16 +0200 Subject: [PATCH] diagnostics for EA-76351 - IVFAE: VirtualDirectoryImpl.getChildren --- .../com/intellij/psi/NonClasspathClassFinder.java | 10 +++++++++- .../openapi/roots/impl/PackageDirectoryCache.java | 14 ++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/NonClasspathClassFinder.java b/java/java-psi-impl/src/com/intellij/psi/NonClasspathClassFinder.java index a87ea2230c8d..cc025432c9b7 100644 --- a/java/java-psi-impl/src/com/intellij/psi/NonClasspathClassFinder.java +++ b/java/java-psi-impl/src/com/intellij/psi/NonClasspathClassFinder.java @@ -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 roots = calcClassRoots(); + List 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; } diff --git a/platform/core-impl/src/com/intellij/openapi/roots/impl/PackageDirectoryCache.java b/platform/core-impl/src/com/intellij/openapi/roots/impl/PackageDirectoryCache.java index a43dd7f42bc3..c4d6cacfd5fd 100644 --- a/platform/core-impl/src/com/intellij/openapi/roots/impl/PackageDirectoryCache.java +++ b/platform/core-impl/src/com/intellij/openapi/roots/impl/PackageDirectoryCache.java @@ -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 myRootsByPackagePrefix; + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.impl.PackageDirectoryCache"); + private final MultiMap myRootsByPackagePrefix = MultiMap.create(); private final Map myDirectoriesByPackageNameCache = ContainerUtil.newConcurrentMap(); private final Set myNonExistentPackages = ContainerUtil.newConcurrentSet(); public PackageDirectoryCache(@NotNull MultiMap 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() {