diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java index d0bd554bf1c5..40cf8c048143 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java @@ -16,6 +16,7 @@ package com.intellij.codeInsight.daemon; import com.intellij.codeHighlighting.Pass; +import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.injected.editor.EditorWindow; import com.intellij.openapi.editor.Editor; @@ -46,7 +47,8 @@ public abstract class LightDaemonAnalyzerTestCase extends LightCodeInsightTestCa @Override protected void tearDown() throws Exception { - DaemonCodeAnalyzer.getInstance(getProject()).projectClosed(); + DaemonCodeAnalyzerImpl codeAnalyzer = (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(getProject()); + codeAnalyzer.projectClosed(); super.tearDown(); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index c0d7fd498f5b..57353aafea0c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -361,7 +361,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx if (myUpdateProgress != null) { myUpdateProgress.cancel(); - myPassExecutorService.cancelAll(); + myPassExecutorService.cancelAll(false); cancelVisibleProgress(); myUpdateProgress = null; } @@ -626,4 +626,8 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx return UpdateHighlightersUtil.getFileLeveleHighlights(project, file); } + @TestOnly + public void clearPasses() { + myPassExecutorService.cancelAll(true); + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java index f3d4a3b4983f..525c97024724 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java @@ -61,7 +61,7 @@ public abstract class PassExecutorService implements Disposable { private final Map> mySubmittedPasses = new ConcurrentHashMap>(); private final Project myProject; - private boolean isDisposed; + private volatile boolean isDisposed; private final AtomicInteger nextPassId = new AtomicInteger(100); public PassExecutorService(Project project) { @@ -70,28 +70,29 @@ public abstract class PassExecutorService implements Disposable { } public void dispose() { - for (Job submittedPass : mySubmittedPasses.values()) { - submittedPass.cancel(); - } - for (Job job : mySubmittedPasses.values()) { - try { - if (!job.isDone()) ((JobImpl)job).waitForTermination(); - } - catch (Throwable throwable) { - LOG.error(throwable); - } - } + cancelAll(true); isDisposed = true; } - public void cancelAll() { + public void cancelAll(boolean waitForTermination) { for (Job submittedPass : mySubmittedPasses.values()) { submittedPass.cancel(); } + if (waitForTermination) { + for (Job job : mySubmittedPasses.values()) { + try { + if (!job.isDone()) ((JobImpl)job).waitForTermination(); + } + catch (Throwable throwable) { + LOG.error(throwable); + } + } + } mySubmittedPasses.clear(); } public void submitPasses(Map passesMap, DaemonProgressIndicator updateProgress, final int jobPriority) { + if (isDisposed()) return; int id = 1; // (doc, passId) -> created pass diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index 2ea7bf964393..3205bf938fe1 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -1086,7 +1086,8 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig public static List instantiateAndRun(PsiFile file, Editor editor, int[] toIgnore, boolean allowDirt) { Project project = file.getProject(); ensureIndexesUpToDate(project); - FileStatusMap fileStatusMap = ((DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(project)).getFileStatusMap(); + DaemonCodeAnalyzerImpl codeAnalyzer = (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(project); + FileStatusMap fileStatusMap = codeAnalyzer.getFileStatusMap(); for (int ignoreId : toIgnore) { fileStatusMap.markFileUpToDate(editor.getDocument(), file, ignoreId); } @@ -1108,6 +1109,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig } finally { fileStatusMap.allowDirt(true); + codeAnalyzer.clearPasses(); } }