diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index 7852e7d7d68d..01a0207528ed 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -269,7 +269,6 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { break; } } - myManager.dropResolveCaches(); } catch (ProcessCanceledException e) { canceled.set(true); diff --git a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java index dbdea01d3345..c24f82cba12d 100644 --- a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java +++ b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java @@ -46,6 +46,7 @@ import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.StatusBar; +import com.intellij.openapi.wm.ex.ProgressIndicatorEx; import com.intellij.psi.*; import com.intellij.psi.search.*; import com.intellij.psi.util.PsiUtilCore; @@ -334,6 +335,7 @@ public class FindUsagesManager implements JDOMExternalizable { final UsageSearcher usageSearcher = createUsageSearcher(descriptor, handler, findUsagesOptions, null); final ProgressIndicatorBase indicator = new ProgressIndicatorBase(); + dropResolveCacheRegularly(indicator, handler.getProject()); ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { @Override public void run() { @@ -482,12 +484,33 @@ public class FindUsagesManager implements JDOMExternalizable { myAnotherManager.searchAndShowUsages(targets, new Factory() { @Override public UsageSearcher create() { + dropResolveCacheRegularly(ProgressManager.getInstance().getProgressIndicator(), myProject); return createUsageSearcher(descriptor, handler, findUsagesOptions, null); } }, !toSkipUsagePanelWhenOneUsage, true, createPresentation(elements.get(0), findUsagesOptions, toOpenInNewTab), null); addToHistory(elements, findUsagesOptions); } + private static void dropResolveCacheRegularly(ProgressIndicator indicator, final Project project) { + if (indicator instanceof ProgressIndicatorEx) { + ((ProgressIndicatorEx)indicator).addStateDelegate(new ProgressIndicatorBase() { + volatile long lastCleared = System.currentTimeMillis(); + + @Override + public void setFraction(double fraction) { + super.setFraction(fraction); + long current = System.currentTimeMillis(); + if (current - lastCleared >= 500) { + lastCleared = current; + // fraction is changed when each file is processed => + // resolve caches used when searching in that file are likely to be not needed anymore + PsiManager.getInstance(project).dropResolveCaches(); + } + } + }); + } + } + @NotNull private static UsageViewPresentation createPresentation(@NotNull PsiElement psiElement, @NotNull FindUsagesOptions findUsagesOptions,