From e47e0e968164f95c8627e553a4fa85b722fb5ef1 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 16 Aug 2013 20:34:48 +0400 Subject: [PATCH] moved to core --- .../openapi/application/WriteAction.java | 16 +++++++-- .../openapi/command/WriteCommandAction.java | 34 +++++-------------- 2 files changed, 22 insertions(+), 28 deletions(-) rename platform/{platform-api => core-api}/src/com/intellij/openapi/application/WriteAction.java (85%) rename platform/{lang-api => core-api}/src/com/intellij/openapi/command/WriteCommandAction.java (83%) diff --git a/platform/platform-api/src/com/intellij/openapi/application/WriteAction.java b/platform/core-api/src/com/intellij/openapi/application/WriteAction.java similarity index 85% rename from platform/platform-api/src/com/intellij/openapi/application/WriteAction.java rename to platform/core-api/src/com/intellij/openapi/application/WriteAction.java index aad00046fb00..b8c5e16ceaf6 100644 --- a/platform/platform-api/src/com/intellij/openapi/application/WriteAction.java +++ b/platform/core-api/src/com/intellij/openapi/application/WriteAction.java @@ -16,10 +16,11 @@ package com.intellij.openapi.application; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.ui.GuiUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; + public abstract class WriteAction extends BaseActionRunnable { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.application.WriteAction"); @NotNull @@ -37,7 +38,7 @@ public abstract class WriteAction extends BaseActionRunnable { if (!application.isDispatchThread() && application.isReadAccessAllowed()) { LOG.error("Must not start write action from within read action in the other thread - deadlock is coming"); } - GuiUtils.runOrInvokeAndWait(new Runnable() { + Runnable runnable = new Runnable() { @Override public void run() { application.runWriteAction(new Runnable() { @@ -47,7 +48,16 @@ public abstract class WriteAction extends BaseActionRunnable { } }); } - }); + }; + if (application.isDispatchThread()) { + runnable.run(); + } + else if (application.isReadAccessAllowed()) { + LOG.error("Calling write action from read-action leads to deadlock."); + } + else { + SwingUtilities.invokeAndWait(runnable); + } } catch (Exception e) { if (isSilentExecution()) { diff --git a/platform/lang-api/src/com/intellij/openapi/command/WriteCommandAction.java b/platform/core-api/src/com/intellij/openapi/command/WriteCommandAction.java similarity index 83% rename from platform/lang-api/src/com/intellij/openapi/command/WriteCommandAction.java rename to platform/core-api/src/com/intellij/openapi/command/WriteCommandAction.java index b7887d10827b..4be6c358effc 100644 --- a/platform/lang-api/src/com/intellij/openapi/command/WriteCommandAction.java +++ b/platform/core-api/src/com/intellij/openapi/command/WriteCommandAction.java @@ -15,23 +15,19 @@ */ package com.intellij.openapi.command; +import com.intellij.codeInsight.FileModificationService; import com.intellij.openapi.application.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.ReadonlyStatusHandler; -import com.intellij.openapi.vfs.VfsUtilCore; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; -import com.intellij.ui.GuiUtils; -import com.intellij.util.SmartList; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Collection; -import java.util.List; public abstract class WriteCommandAction extends BaseActionRunnable { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.command.WriteCommandAction"); @@ -84,11 +80,14 @@ public abstract class WriteCommandAction extends BaseActionRunnable { } }; Application application = ApplicationManager.getApplication(); - if (application.isWriteAccessAllowed() || application.isDispatchThread()) { + if (application.isDispatchThread()) { runnable.run(); } + else if (application.isReadAccessAllowed()) { + LOG.error("Calling write command from read-action leads to deadlock."); + } else { - GuiUtils.invokeAndWait(runnable); + SwingUtilities.invokeAndWait(runnable); } } catch (InvocationTargetException e) { @@ -99,26 +98,11 @@ public abstract class WriteCommandAction extends BaseActionRunnable { } public static boolean ensureFilesWritable(@NotNull final Project project, @NotNull final Collection psiFiles) { - if (!psiFiles.isEmpty()) { - List list = new SmartList(); - for (final PsiFile psiFile : psiFiles) { - if (psiFile == null) continue; - final VirtualFile virtualFile = psiFile.getVirtualFile(); - if (virtualFile != null) { - list.add(virtualFile); - } - } - if (!list.isEmpty()) { - if (ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(VfsUtilCore.toVirtualFileArray(list)).hasReadonlyFiles()) { - return false; - } - } - } - return true; + return FileModificationService.getInstance().preparePsiElementsForWrite(psiFiles); } private void performWriteCommandAction(final RunResult result) { - if (myProject != null && !ensureFilesWritable(myProject, Arrays.asList(myPsiFiles))) return; + if (!FileModificationService.getInstance().preparePsiElementsForWrite(Arrays.asList(myPsiFiles))) return; //this is needed to prevent memory leak, since command // is put into undo queue