mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
introduce PsiManager#dropPsiCaches which clear resolve cache, increments PSI mod counts, leads to highlighting restart and whatnot
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -62,6 +62,6 @@ public class PsiMigrationManager {
|
||||
myCurrentMigration = null;
|
||||
}
|
||||
|
||||
PsiManagerEx.getInstanceEx(myProject).beforeChange(true);
|
||||
PsiManager.getInstance(myProject).dropPsiCaches();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user