From 43a78a8126ead8f2268ac32f91e9228ae0630f91 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 23 Nov 2015 15:11:45 +0300 Subject: [PATCH] platform: PerformFixesModalTask launches intention action based quick fix in read-action if possible --- .../ex/PerformFixesModalTask.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/PerformFixesModalTask.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/PerformFixesModalTask.java index 4938e98e99ec..96281b57098f 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/PerformFixesModalTask.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/PerformFixesModalTask.java @@ -15,8 +15,10 @@ */ package com.intellij.codeInspection.ex; +import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.CommonProblemDescriptor; import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.QuickFix; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.DumbModePermission; @@ -70,6 +72,22 @@ public abstract class PerformFixesModalTask implements SequentialTask { } indicator.setText("Processing " + presentableText); } + + final boolean[] runInReadAction = {false}; + final QuickFix[] fixes = descriptor.getFixes(); + if (fixes != null) { + for (QuickFix fix : fixes) { + if (fix instanceof IntentionAction) { + if (!((IntentionAction)fix).startInWriteAction()) { + runInReadAction[0] = true; + } else { + runInReadAction[0] = false; + break; + } + } + } + } + DumbService.allowStartingDumbModeInside(DumbModePermission.MAY_START_MODAL, new Runnable() { @Override public void run() { @@ -77,9 +95,14 @@ public abstract class PerformFixesModalTask implements SequentialTask { @Override public void run() { myDocumentManager.commitAllDocuments(); - applyFix(myProject, descriptor); + if (!runInReadAction[0]) { + applyFix(myProject, descriptor); + } } }); + if (runInReadAction[0]) { + applyFix(myProject, descriptor); + } } }); return isDone();