introduce PsiManager#dropPsiCaches which clear resolve cache, increments PSI mod counts, leads to highlighting restart and whatnot

This commit is contained in:
peter
2017-05-09 10:33:10 +02:00
parent a38fcecefe
commit 8920a8effe
18 changed files with 39 additions and 79 deletions

View File

@@ -61,7 +61,6 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.*;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.xml.XmlDocument;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
@@ -114,12 +113,12 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
private void notifyAfterAnnotationChanging(@NotNull PsiModifierListOwner owner, @NotNull String annotationFQName, boolean successful) {
myBus.syncPublisher(TOPIC).afterExternalAnnotationChanging(owner, annotationFQName, successful);
((PsiModificationTrackerImpl)myPsiManager.getModificationTracker()).incCounter();
myPsiManager.dropPsiCaches();
}
private void notifyChangedExternally() {
myBus.syncPublisher(TOPIC).externalAnnotationsChangedExternally();
((PsiModificationTrackerImpl)myPsiManager.getModificationTracker()).incCounter();
myPsiManager.dropPsiCaches();
}
@Override

View File

@@ -62,6 +62,6 @@ public class PsiMigrationManager {
myCurrentMigration = null;
}
PsiManagerEx.getInstanceEx(myProject).beforeChange(true);
PsiManager.getInstance(myProject).dropPsiCaches();
}
}

View File

@@ -33,7 +33,7 @@ import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiManagerImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.testFramework.SkipSlowTestLocally;
@@ -102,9 +102,7 @@ public class HighlightStressTest extends LightDaemonAnalyzerTestCase {
long time = System.currentTimeMillis();
for (int i = 0; i < 20/*00000*/; i++) {
//System.out.println("i = " + i);
getPsiManager().dropResolveCaches();
((PsiManagerEx)getPsiManager()).getFileManager().cleanupForNextTest();
DaemonCodeAnalyzer.getInstance(getProject()).restart();
((PsiManagerImpl)getPsiManager()).cleanupForNextTest();
configureFromFileText("Stress.java", text);
List<HighlightInfo> infos = doHighlighting();

View File

@@ -20,9 +20,7 @@ import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.JavaPsiFacadeEx;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.search.ProjectScope;
import com.intellij.testFramework.EdtTestUtil;
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture;
import com.intellij.testFramework.fixtures.TempDirTestFixture;
@@ -82,15 +80,4 @@ public class JavaCodeInsightTestFixtureImpl extends CodeInsightTestFixtureImpl i
return aPackage;
}
@Override
public void tearDown() throws Exception {
try {
EdtTestUtil.runInEdtAndWait(() -> {
((PsiModificationTrackerImpl)getPsiManager().getModificationTracker()).incCounter();// drop all caches
});
}
finally {
super.tearDown();
}
}
}

View File

@@ -146,10 +146,16 @@ public abstract class PsiManager extends UserDataHolderBase {
/**
* Clears the resolve caches of the PSI manager. Can be used to reduce memory consumption
* in batch operations sequentially processing multiple files.
* in batch operations sequentially processing multiple files. Can be invoked from any thread.
*/
public abstract void dropResolveCaches();
/**
* Clears all {@link com.intellij.psi.util.CachedValue} depending on {@link PsiModificationTracker#MODIFICATION_COUNT} and resolve caches.
* Can be used to reduce memory consumption in batch operations sequentially processing multiple files. Should be invoked on Swing thread.
*/
public abstract void dropPsiCaches();
/**
* Checks if the specified PSI element belongs to the sources of the project.
*

View File

@@ -19,6 +19,8 @@ package com.intellij.psi.impl;
import com.intellij.lang.PsiBuilderFactory;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.fileEditor.FileDocumentManager;
@@ -109,6 +111,12 @@ public class PsiManagerImpl extends PsiManagerEx {
beforeChange(false);
}
@Override
public void dropPsiCaches() {
dropResolveCaches();
WriteAction.run(() -> ((PsiModificationTrackerImpl)myModificationTracker).incCounter());
}
@Override
public boolean isInProject(@NotNull PsiElement element) {
if (element instanceof PsiDirectoryContainer) {
@@ -493,6 +501,6 @@ public class PsiManagerImpl extends PsiManagerEx {
public void cleanupForNextTest() {
assert ApplicationManager.getApplication().isUnitTestMode();
myFileManager.cleanupForNextTest();
dropResolveCaches();
dropPsiCaches();
}
}

View File

@@ -1107,8 +1107,7 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF
private void rebuildStub() {
ApplicationManager.getApplication().invokeLater(() -> {
if (!myManager.isDisposed()) {
myManager.dropResolveCaches();
((PsiModificationTrackerImpl)myManager.getModificationTracker()).incCounter();
myManager.dropPsiCaches();
}
final VirtualFile vFile = getVirtualFile();

View File

@@ -128,6 +128,11 @@ public class MockPsiManager extends PsiManagerEx {
getFileManager().cleanupForNextTest();
}
@Override
public void dropPsiCaches() {
dropResolveCaches();
}
@Override
public boolean isInProject(@NotNull PsiElement element) {
return false;

View File

@@ -35,7 +35,6 @@ import com.intellij.openapi.util.EmptyRunnable;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.util.EventDispatcher;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
@@ -403,9 +402,7 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Pers
incModificationCount();
PsiManager psiManager = PsiManager.getInstance(myProject);
psiManager.dropResolveCaches();
((PsiModificationTrackerImpl)psiManager.getModificationTracker()).incCounter();
PsiManager.getInstance(myProject).dropPsiCaches();
fireRootsChangedEvent(fileTypes);

View File

@@ -101,7 +101,6 @@ import com.intellij.psi.*;
import com.intellij.psi.impl.DebugUtil;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiManagerImpl;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.impl.cache.CacheManager;
import com.intellij.psi.impl.cache.impl.todo.TodoIndex;
import com.intellij.psi.impl.source.PsiFileImpl;
@@ -977,7 +976,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
throw new RuntimeException(e);
}
finally {
((PsiModificationTrackerImpl)PsiManager.getInstance(getProject()).getModificationTracker()).incCounter();
PsiManager.getInstance(getProject()).dropPsiCaches();
}
}
}.execute().getResultObject();

View File

@@ -4,7 +4,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
@@ -53,7 +52,7 @@ public class ReferenceInjectionTest extends LightCodeInsightFixtureTestCase {
Element element = configuration.getState();
configuration.loadState(element);
((PsiModificationTrackerImpl)PsiManager.getInstance(getProject()).getModificationTracker()).incCounter();
PsiManager.getInstance(getProject()).dropPsiCaches();
assertTrue(myFixture.getReferenceAtCaretPosition() instanceof FileReference);
UnInjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile());

View File

@@ -15,7 +15,6 @@
*/
package org.intellij.plugins.intelliLang.inject;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.codeInsight.hint.QuestionAction;
import com.intellij.codeInsight.intention.IntentionAction;
@@ -38,7 +37,6 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.injection.Injectable;
import com.intellij.psi.injection.ReferenceInjector;
import com.intellij.psi.util.PsiTreeUtil;
@@ -168,8 +166,7 @@ public class InjectLanguageAction implements IntentionAction, LowPriorityAction
FileContentUtil.reparseFiles(project, Collections.emptyList(), true);
}
else {
((PsiModificationTrackerImpl)PsiManager.getInstance(project).getModificationTracker()).incCounter();
DaemonCodeAnalyzer.getInstance(project).restart();
PsiManager.getInstance(project).dropPsiCaches();
}
}
}

View File

@@ -25,7 +25,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.intellij.util.FileContentUtil;
import com.intellij.util.IncorrectOperationException;
@@ -75,7 +74,7 @@ public class UnInjectLanguageAction implements IntentionAction, LowPriorityActio
PsiLanguageInjectionHost host = (PsiLanguageInjectionHost)reference.getElement();
for (LanguageInjectionSupport support : InjectorUtils.getActiveInjectionSupports()) {
if (support.isApplicableTo(host) && support.removeInjectionInPlace(host)) {
((PsiModificationTrackerImpl)PsiManager.getInstance(project).getModificationTracker()).incCounter();
PsiManager.getInstance(project).dropPsiCaches();
return;
}
}
@@ -84,7 +83,7 @@ public class UnInjectLanguageAction implements IntentionAction, LowPriorityActio
LanguageInjectionSupport support = element.getUserData(LanguageInjectionSupport.INJECTOR_SUPPORT);
if (support != null) {
if (support.removeInjection(element)) {
((PsiModificationTrackerImpl)PsiManager.getInstance(project).getModificationTracker()).incCounter();
PsiManager.getInstance(project).dropPsiCaches();
}
}
return;

View File

@@ -15,17 +15,14 @@
*/
package com.intellij.lang.ant;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.lang.ant.dom.AntDomAntlib;
import com.intellij.lang.ant.dom.AntDomElement;
import com.intellij.lang.ant.dom.AntDomProject;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.ui.GuiUtils;
@@ -35,30 +32,14 @@ import com.intellij.util.xml.DomFileElement;
import com.intellij.util.xml.DomManager;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
public class AntSupport {
public static void markFileAsAntFile(final VirtualFile file, final Project project, final boolean value) {
if (file.isValid() && ForcedAntFileAttribute.isAntFile(file) != value) {
ForcedAntFileAttribute.forceAntFile(file, value);
GuiUtils.invokeLaterIfNeeded(() -> {
((PsiModificationTrackerImpl)PsiManager.getInstance(project).getModificationTracker()).incCounter();
restartDaemon(project);
}, ModalityState.defaultModalityState(), project.getDisposed());
GuiUtils.invokeLaterIfNeeded(() -> PsiManager.getInstance(project).dropPsiCaches(), ModalityState.defaultModalityState(), project.getDisposed());
}
}
private static void restartDaemon(Project project) {
final DaemonCodeAnalyzer daemon = DaemonCodeAnalyzer.getInstance(project);
if (ApplicationManager.getApplication().isDispatchThread()) {
daemon.restart();
}
else {
SwingUtilities.invokeLater(daemon::restart);
}
}
//
// Managing ant files dependencies via the <import> task.

View File

@@ -32,7 +32,7 @@ import com.intellij.openapi.vfs.VirtualFileEvent;
import com.intellij.openapi.vfs.VirtualFileListener;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.CachedValue;
@@ -154,7 +154,7 @@ public class GroovyDslFileIndex extends ScalarIndexExtension<String> {
app.invokeLater(() -> {
for (Project project : ProjectManager.getInstance().getOpenProjects()) {
project.putUserData(SCRIPTS_CACHE, null);
((PsiModificationTrackerImpl)PsiManager.getInstance(project).getModificationTracker()).incCounter();
PsiManagerEx.getInstanceEx(project).dropPsiCaches();
}
}, app.getDisposed());
}

View File

@@ -15,7 +15,6 @@
*/
package org.jetbrains.plugins.groovy.annotator.intentions.dynamic;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.openapi.application.TransactionGuard;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
@@ -24,7 +23,6 @@ import com.intellij.openapi.wm.ToolWindow;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiVariable;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.ui.treeStructure.treetable.ListTreeTableModelOnColumns;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.tree.TreeUtil;
@@ -366,10 +364,7 @@ public class DynamicManagerImpl extends DynamicManager {
@Override
public void fireChange() {
TransactionGuard.submitTransaction(myProject, () -> {
((PsiModificationTrackerImpl)PsiManager.getInstance(myProject).getModificationTracker()).incCounter();
DaemonCodeAnalyzer.getInstance(myProject).restart();
});
TransactionGuard.submitTransaction(myProject, () -> PsiManager.getInstance(myProject).dropPsiCaches());
}
@Override

View File

@@ -114,7 +114,7 @@ public class DomPerformanceTest extends DomHardCoreTestCase{
}
}.execute();
((PsiManagerImpl)getPsiManager()).getFileManager().cleanupForNextTest();
((PsiManagerImpl)getPsiManager()).cleanupForNextTest();
final XmlFile file = (XmlFile)getPsiManager().findFile(virtualFile);
assertFalse(file.getNode().isParsed());
assertTrue(StringUtil.isNotEmpty(file.getText()));

View File

@@ -15,11 +15,8 @@
*/
package com.intellij.util.xml.impl;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.XmlElementFactory;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
@@ -28,7 +25,6 @@ import com.intellij.util.IncorrectOperationException;
import com.intellij.util.xml.*;
import com.intellij.util.xml.events.DomEvent;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@@ -110,12 +106,7 @@ public abstract class DomTestCase extends LightIdeaTestCase {
}
protected static void incModCount() {
new WriteCommandAction(getProject()) {
@Override
protected void run(@NotNull Result result) throws Throwable {
((PsiModificationTrackerImpl)getPsiManager().getModificationTracker()).incCounter();
}
}.execute();
getPsiManager().dropPsiCaches();
}
@Nullable