diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java index f82f6680486c..61f63512068e 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java @@ -193,7 +193,7 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { protected void tearDown() throws Exception { ((StartupManagerImpl)StartupManager.getInstance(getProject())).checkCleared(); if (toInitializeDaemon) { - ((DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(getProject())).projectClosed(); + ((DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(getProject())).cleanupAfterTest(false); } super.tearDown(); ((VirtualFilePointerManagerImpl)VirtualFilePointerManager.getInstance()).assertPointersDisposed(); diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java index a5240d894ba3..b2b810b817de 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java @@ -48,9 +48,7 @@ public abstract class LightDaemonAnalyzerTestCase extends LightCodeInsightTestCa @Override protected void tearDown() throws Exception { - DaemonCodeAnalyzerImpl codeAnalyzer = (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(getProject()); - codeAnalyzer.projectClosed(); - + ((DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(getProject())).cleanupAfterTest(true); // has to cleanup by hand since light project does not get disposed any time soon 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 dbcdd3292d01..832fb318eab1 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 @@ -109,6 +109,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx private int myModificationCount = 0; private volatile boolean allowToInterrupt = true; + private StatusBarUpdater myStatusBarUpdater; public DaemonCodeAnalyzerImpl(Project project, DaemonCodeAnalyzerSettings daemonCodeAnalyzerSettings, EditorTracker editorTracker) { myProject = project; @@ -249,6 +250,19 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx waitForTermination(); } + @TestOnly + public void cleanupAfterTest(boolean forceDispose) { + projectClosed(); + if (forceDispose) { + Disposer.dispose(myStatusBarUpdater); + myStatusBarUpdater = null; + Disposer.dispose(myDaemonListeners); + myDaemonListeners = null; + } + setUpdateByTimerEnabled(false); + waitForTermination(); + } + private void waitForTermination() { myPassExecutorService.cancelAll(true); } @@ -267,8 +281,8 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx @Override public void projectOpened() { assert !myInitialized : "Double Initializing"; - StatusBarUpdater statusBarUpdater = new StatusBarUpdater(myProject); - Disposer.register(myProject, statusBarUpdater); + myStatusBarUpdater = new StatusBarUpdater(myProject); + Disposer.register(myProject, myStatusBarUpdater); myDaemonListeners = new DaemonListeners(myProject, this, myEditorTracker); Disposer.register(myProject, myDaemonListeners); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/StatusBarUpdater.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/StatusBarUpdater.java index da03072428fc..6606a78841af 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/StatusBarUpdater.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/StatusBarUpdater.java @@ -51,14 +51,14 @@ public class StatusBarUpdater implements Disposable { }; EditorFactory.getInstance().getEventMulticaster().addCaretListener(caretListener, this); - project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() { + project.getMessageBus().connect(this).subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() { @Override public void selectionChanged(FileEditorManagerEvent event) { updateLater(); } }); - project.getMessageBus().connect().subscribe(DaemonCodeAnalyzer.DAEMON_EVENT_TOPIC, new DaemonCodeAnalyzer.DaemonListener() { + project.getMessageBus().connect(this).subscribe(DaemonCodeAnalyzer.DAEMON_EVENT_TOPIC, new DaemonCodeAnalyzer.DaemonListener() { @Override public void daemonFinished() { updateLater(); @@ -68,11 +68,11 @@ public class StatusBarUpdater implements Disposable { private void updateLater() { final Application application = ApplicationManager.getApplication(); - if (!application.isUnitTestMode()) { - application.invokeLater(myUpdateStatusRunnable); + if (application.isUnitTestMode()) { + myUpdateStatusRunnable.run(); } else { - myUpdateStatusRunnable.run(); + application.invokeLater(myUpdateStatusRunnable); } } 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 f9159d1aed9c..779e883e6877 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -998,7 +998,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig editorManager.closeFile(openFile); } if (toInitializeDaemon) { - ((DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(getProject())).projectClosed(); + ((DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(getProject())).cleanupAfterTest(false); } myEditor = null;