From f2ffb703445faf4e7e9eb13075dce013e2f0b1cd Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 1 Sep 2010 15:50:04 +0400 Subject: [PATCH] do not restart daemon on saving settings --- .../daemon/impl/DaemonListeners.java | 24 ++++++------ .../openapi/editor/DocumentRunnable.java | 10 ++++- .../com/intellij/ide/SaveAndSyncHandler.java | 4 +- .../application/impl/ApplicationImpl.java | 2 +- .../components/impl/stores/StorageUtil.java | 4 +- .../openapi/options/SchemesManagerImpl.java | 39 ++++++------------- 6 files changed, 38 insertions(+), 45 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java index 080bbfe74406..1ade3beb6720 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java @@ -39,7 +39,6 @@ import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.event.*; import com.intellij.openapi.editor.ex.EditorEventMulticasterEx; -import com.intellij.openapi.editor.impl.softwrap.SoftWrapHelper; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; @@ -315,26 +314,27 @@ public class DaemonListeners implements Disposable { if (LOG.isDebugEnabled()) { LOG.debug("cancelling code highlighting by write action:" + action); } + if (containsDocumentWorthBothering(action)) { + stopDaemon(false); + } + } + + private boolean containsDocumentWorthBothering(Object action) { if (action instanceof DocumentRunnable) { + if (action instanceof DocumentRunnable.IgnoreDocumentRunnable) return false; Document document = ((DocumentRunnable)action).getDocument(); if (!worthBothering(document, ((DocumentRunnable)action).getProject())) { - return; + return false; } } - stopDaemon(false); + return true; } public void writeActionFinished(Object action) { - if (myDaemonCodeAnalyzer.isRunning()) { - return; + if (myDaemonCodeAnalyzer.isRunning()) return; + if (containsDocumentWorthBothering(action)) { + stopDaemon(true); } - if (action instanceof DocumentRunnable) { - Document document = ((DocumentRunnable)action).getDocument(); - if (!worthBothering(document, ((DocumentRunnable)action).getProject())) { - return; - } - } - stopDaemon(true); } } diff --git a/platform/platform-api/src/com/intellij/openapi/editor/DocumentRunnable.java b/platform/platform-api/src/com/intellij/openapi/editor/DocumentRunnable.java index 13fc0b7e8026..8b2133775564 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/DocumentRunnable.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/DocumentRunnable.java @@ -16,7 +16,7 @@ package com.intellij.openapi.editor; import com.intellij.openapi.project.Project; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author cdr @@ -25,7 +25,7 @@ public abstract class DocumentRunnable implements Runnable { private final Document myDocument; private final Project myProject; - public DocumentRunnable(@NotNull Document document, Project project) { + public DocumentRunnable(@Nullable Document document, Project project) { myDocument = document; myProject = project; } @@ -37,4 +37,10 @@ public abstract class DocumentRunnable implements Runnable { public Project getProject() { return myProject; } + + public abstract static class IgnoreDocumentRunnable extends DocumentRunnable { + public IgnoreDocumentRunnable() { + super(null, null); + } + } } diff --git a/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandler.java b/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandler.java index 4ccb21f13d41..56b4a54cbf56 100644 --- a/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandler.java +++ b/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandler.java @@ -105,8 +105,8 @@ public class SaveAndSyncHandler implements ApplicationComponent { return !LaterInvocator.isInModalContext() && !ProgressManager.getInstance().hasModalProgressIndicator(); } - - private static void saveProjectsAndDocuments() { + // made public for tests + public static void saveProjectsAndDocuments() { if (LOG.isDebugEnabled()) { LOG.debug("enter: save()"); } diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 2d759ef532e5..12b3b0641ebe 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -1018,7 +1018,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application myDispatcher.getMulticaster().writeActionFinished(action); } - public void _saveSettings() { // for testing purposes + public void _saveSettings() { // public for testing purposes if (mySaveSettingsIsInProgress.compareAndSet(false, true)) { try { doSave(); diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java index 351e8c9e3d5c..460ad7e1ea7d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java @@ -25,6 +25,7 @@ import com.intellij.openapi.components.RoamingType; import com.intellij.openapi.components.StateStorage; import com.intellij.openapi.components.TrackingPathMacroSubstitutor; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.DocumentRunnable; import com.intellij.openapi.options.StreamProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; @@ -101,7 +102,8 @@ public class StorageUtil { file.renameTo(backupFile); } - ApplicationManager.getApplication().runWriteAction(new Runnable() { + // mark this action as modifying the file which daemon analyzer should ignore + ApplicationManager.getApplication().runWriteAction(new DocumentRunnable.IgnoreDocumentRunnable() { public void run() { if (!file.exists()) { file.createParentDirs(); diff --git a/platform/platform-impl/src/com/intellij/openapi/options/SchemesManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/options/SchemesManagerImpl.java index e78104de9b9d..c3ea8ae51948 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/SchemesManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/SchemesManagerImpl.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.impl.ApplicationImpl; import com.intellij.openapi.components.RoamingType; import com.intellij.openapi.components.impl.stores.StorageUtil; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.DocumentRunnable; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.InvalidDataException; @@ -543,10 +544,7 @@ public class SchemesManagerImpl 0) { + if (myDeletedNames.isEmpty()) { + deleteServerFiles(DELETED_XML); + } + else { for (StreamProvider provider : getEnabledProviders()) { try { StorageUtil.sendContent(provider, getFileFullPath(DELETED_XML), createDeletedDocument(), myRoamingType, true); @@ -791,10 +781,6 @@ public class SchemesManagerImpl