From 846e50a0c0343cd7a5f1e4f06fc7ea21efdac602 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Fri, 28 Feb 2020 12:17:13 +0100 Subject: [PATCH] Backport ActionUtil.underModalProgress to fix 191/192 compilation Relates to #EA-143709 --- .../extractionEngine/ExtractionEngine.kt | 7 +++--- .../idea/util/ProgressIndicatorUtils.kt | 10 ++++++++ .../idea/util/ProgressIndicatorUtils.kt.191 | 20 ++++++++++++++++ .../idea/util/ProgressIndicatorUtils.kt.192 | 24 +++++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionEngine.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionEngine.kt index 110baf30b37..0ff8dd9afbc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionEngine.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionEngine.kt @@ -16,17 +16,18 @@ package org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine -import com.intellij.openapi.actionSystem.ex.ActionUtil import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.openapi.ui.MessageType import com.intellij.openapi.ui.popup.Balloon import com.intellij.openapi.ui.popup.JBPopupFactory +import com.intellij.openapi.util.Computable import com.intellij.refactoring.BaseRefactoringProcessor import com.intellij.ui.awt.RelativePoint import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint +import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import javax.swing.event.HyperlinkEvent @@ -59,9 +60,9 @@ class ExtractionEngine( val project = extractionData.project val adjustExtractionData = helper.adjustExtractionData(extractionData) - val analysisResult = ActionUtil.underModalProgress(project, "Analyze extraction data...") { + val analysisResult = ProgressIndicatorUtils.underModalProgress(project, "Analyze extraction data...", Computable { adjustExtractionData.performAnalysis() - } + }) if (ApplicationManager.getApplication()!!.isUnitTestMode && analysisResult.status != AnalysisResult.Status.SUCCESS) { throw BaseRefactoringProcessor.ConflictsInTestsException(analysisResult.messages.map { it.renderMessage() }) diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt index 562cf4f24f6..5f84829b909 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt @@ -8,7 +8,10 @@ package org.jetbrains.kotlin.idea.util import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Computable import com.intellij.util.ExceptionUtil +import org.jetbrains.annotations.Nls import java.util.concurrent.CancellationException import java.util.concurrent.Future import java.util.concurrent.TimeUnit @@ -18,6 +21,13 @@ import java.util.concurrent.TimeoutException * Copied from [com.intellij.openapi.progress.util.ProgressIndicatorUtils] */ object ProgressIndicatorUtils { + @Throws(ProcessCanceledException::class) + fun underModalProgress( + project: Project, + @Nls progressTitle: String, + computable: Computable + ): T = com.intellij.openapi.actionSystem.ex.ActionUtil.underModalProgress(project, progressTitle, computable) + @JvmStatic fun awaitWithCheckCanceled(future: Future) { val indicator = diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.191 b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.191 index 19f12247ab0..ea8de15894e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.191 +++ b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.191 @@ -8,6 +8,12 @@ package org.jetbrains.kotlin.idea.util import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.project.DumbService +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Computable +import com.intellij.openapi.util.ThrowableComputable +import org.jetbrains.annotations.Nls +import org.jetbrains.kotlin.idea.util.application.runReadAction import java.util.concurrent.Future import java.util.concurrent.TimeUnit import java.util.concurrent.TimeoutException @@ -15,6 +21,20 @@ import java.util.concurrent.TimeoutException object ProgressIndicatorUtils { private val LOG = Logger.getInstance(ProgressIndicatorUtils::class.java) + fun underModalProgress( + project: Project, + @Nls progressTitle: String, + computable: Computable + ): T { + val dumbService = DumbService.getInstance(project) + val useAlternativeResolve = dumbService.isAlternativeResolveEnabled + val inReadAction = + ThrowableComputable { runReadAction { return@runReadAction computable.compute() } } + val process = + if (useAlternativeResolve) ThrowableComputable { dumbService.computeWithAlternativeResolveEnabled(inReadAction) } else inReadAction + return ProgressManager.getInstance().runProcessWithProgressSynchronously(process, progressTitle, true, project) + } + @JvmStatic fun awaitWithCheckCanceled(future: Future) { while (true) { diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.192 b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.192 index 13cf0e40aa7..af322b15e23 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.192 +++ b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.192 @@ -5,9 +5,33 @@ package org.jetbrains.kotlin.idea.util +import com.intellij.openapi.progress.ProcessCanceledException +import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.project.DumbService +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Computable +import com.intellij.openapi.util.ThrowableComputable +import org.jetbrains.annotations.Nls +import org.jetbrains.kotlin.idea.util.application.runReadAction import java.util.concurrent.Future object ProgressIndicatorUtils { + fun underModalProgress( + project: Project, + @Nls progressTitle: String, + computable: Computable + ): T { + val dumbService = DumbService.getInstance(project) + val useAlternativeResolve = dumbService.isAlternativeResolveEnabled + val inReadAction = + ThrowableComputable { runReadAction { return@runReadAction computable.compute() } } + val prioritizedRunnable = + ThrowableComputable { ProgressManager.getInstance().computePrioritized(inReadAction) } + val process = + if (useAlternativeResolve) ThrowableComputable { dumbService.computeWithAlternativeResolveEnabled(prioritizedRunnable) } else prioritizedRunnable + return ProgressManager.getInstance().runProcessWithProgressSynchronously(process, progressTitle, true, project) + } + @JvmStatic fun awaitWithCheckCanceled(future: Future) = com.intellij.openapi.progress.util.BackgroundTaskUtil.awaitWithCheckCanceled(future)