diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeEx.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeEx.java index 8fffd6c6ea97..484cfc62b942 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeEx.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeEx.java @@ -20,6 +20,7 @@ package com.intellij.psi.impl; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.ThrowableComputable; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.search.GlobalSearchScope; @@ -27,8 +28,6 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; -import java.util.concurrent.Callable; - public abstract class JavaPsiFacadeEx extends JavaPsiFacade { @TestOnly public static JavaPsiFacadeEx getInstanceEx(@NotNull Project project) { @@ -42,16 +41,16 @@ public abstract class JavaPsiFacadeEx extends JavaPsiFacade { * This method uses thread local variables to keep it state. * * @param the type of the result returned by the callable - * @param callable the callable to be executed within the temporary scope + * @param computation the callable to be executed within the temporary scope * @return the result produced by the callable */ @ApiStatus.Internal - public abstract T withTemporaryScopeCaches(Callable callable); + public abstract T withTemporaryScopeCaches(@NotNull ThrowableComputable computation) throws E; /** * @return true if temporary scope caches are enabled, otherwise false * - * @see #withTemporaryScopeCaches(Callable) + * @see #withTemporaryScopeCaches(ThrowableComputable) */ @ApiStatus.Internal public abstract boolean temporaryScopeCachesEnabled(); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java index 51d6db08f275..fd51e941c60e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java @@ -37,7 +37,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentMap; import java.util.function.Predicate; @@ -68,8 +67,6 @@ public final class JavaPsiFacadeImpl extends JavaPsiFacadeEx { (coroutineScope == null ? bus.simpleConnect() : bus.connect(coroutineScope)).subscribe(PsiModificationTracker.TOPIC, () -> { myClassCache.clear(); myPackageCache.clear(); - myCachedTemporaryScopes.get().clear(); - myCachedTemporaryScopes.remove(); }); DummyHolderFactory.setFactory(new JavaDummyHolderFactory()); @@ -87,7 +84,7 @@ public final class JavaPsiFacadeImpl extends JavaPsiFacadeEx { public PsiClass findClass(final @NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { ProgressIndicatorProvider.checkCanceled(); // We hope this method is being called often enough to cancel daemon processes smoothly - if (myTemporaryScopeCacheEnabled.get()) { + if (myTemporaryScopeCacheEnabled.get() && myClassCache.get(scope) == null) { myCachedTemporaryScopes.get().add(scope); } Map> map = myClassCache.computeIfAbsent(scope, scope1 -> CollectionFactory.createConcurrentWeakValueMap()); @@ -515,20 +512,16 @@ public final class JavaPsiFacadeImpl extends JavaPsiFacadeEx { @ApiStatus.Internal @Override - public T withTemporaryScopeCaches(Callable callable) { + public T withTemporaryScopeCaches(@NotNull ThrowableComputable computation) throws E { Boolean previousValue = myTemporaryScopeCacheEnabled.get(); myTemporaryScopeCacheEnabled.set(Boolean.TRUE); try { - return callable.call(); - } - catch (Exception e) { - throw new RuntimeException(e); + return computation.compute(); } finally { for (GlobalSearchScope scope : myCachedTemporaryScopes.get()) { myClassCache.remove(scope); } - myCachedTemporaryScopes.get().clear(); myCachedTemporaryScopes.remove(); myTemporaryScopeCacheEnabled.set(previousValue); }