Make things explicit: let ProgressSuspender.markSuspendable return null instead of throwing ClassCastException

GitOrigin-RevId: a463b7328e89c74f7813ae5c5138f12fe4425f9a
This commit is contained in:
Andrei.Kuznetsov
2023-04-12 13:01:04 +02:00
committed by intellij-monorepo-bot
parent 8cff5ce36d
commit 74c3ff9ff7
5 changed files with 24 additions and 9 deletions

View File

@@ -70,8 +70,17 @@ public final class ProgressSuspender implements AutoCloseable {
}
}
public static @NotNull ProgressSuspender markSuspendable(@NotNull ProgressIndicator indicator, @NotNull @NlsContexts.ProgressText String suspendedText) {
return new ProgressSuspender((ProgressIndicatorEx)indicator, suspendedText);
public static @NotNull ProgressSuspender markSuspendable(@NotNull ProgressIndicatorEx indicator, @NotNull @NlsContexts.ProgressText String suspendedText) {
return new ProgressSuspender(indicator, suspendedText);
}
@Nullable("When progress indicator cannot be made suspendable (e.g. EmptyProgressIndicator)")
public static ProgressSuspender markSuspendable(@NotNull ProgressIndicator indicator, @NotNull @NlsContexts.ProgressText String suspendedText) {
if (indicator instanceof ProgressIndicatorEx indicatorEx) {
return markSuspendable(indicatorEx, suspendedText);
} else {
return null;
}
}
public void executeNonSuspendableSection(@NotNull ProgressIndicator indicator, @NotNull Runnable runnable) {

View File

@@ -23,17 +23,20 @@ class DumbServiceGuiExecutor(project: Project, queue: DumbServiceMergingTaskQueu
internal fun guiSuspender(): MergingQueueGuiSuspender = super.guiSuspender
override fun processTasksWithProgress(suspender: ProgressSuspender,
override fun processTasksWithProgress(suspender: ProgressSuspender?,
visibleIndicator: ProgressIndicator,
parentActivity: StructuredIdeActivity?): SubmissionReceipt? {
val childActivity = createChildActivity(parentActivity)
var taskCompletedNormally = false
return try {
DumbServiceAppIconProgress.registerForProgress(project, visibleIndicator as ProgressIndicatorEx)
project.service<DumbModeProgressTitle>().attachDumbModeProgress(visibleIndicator)
super.processTasksWithProgress(suspender, visibleIndicator, childActivity)
super.processTasksWithProgress(suspender, visibleIndicator, childActivity).also {
taskCompletedNormally = true
}
}
finally {
logProcessFinished(childActivity, if (suspender.isClosed) IndexingFinishType.TERMINATED else IndexingFinishType.FINISHED)
logProcessFinished(childActivity, if (taskCompletedNormally) IndexingFinishType.FINISHED else IndexingFinishType.TERMINATED)
project.service<DumbModeProgressTitle>().removeDumbModeProgress(visibleIndicator)
}
}

View File

@@ -108,7 +108,7 @@ open class MergingQueueGuiExecutor<T : MergeableQueueTask<T>> protected construc
}
}
open fun processTasksWithProgress(suspender: ProgressSuspender,
open fun processTasksWithProgress(suspender: ProgressSuspender?,
visibleIndicator: ProgressIndicator,
activity: StructuredIdeActivity?): SubmissionReceipt? {
return guiSuspender.setCurrentSuspenderAndSuspendIfRequested(suspender, Supplier<SubmissionReceipt> {
@@ -124,7 +124,7 @@ open class MergingQueueGuiExecutor<T : MergeableQueueTask<T>> protected construc
if (task == null) return@Supplier submittedTaskCount
val taskIndicator = task.indicator as AbstractProgressIndicatorExBase
val relayToVisibleIndicator: ProgressIndicatorEx = RelayUiToDelegateIndicator(visibleIndicator)
suspender.attachToProgress(taskIndicator)
suspender?.attachToProgress(taskIndicator)
taskIndicator.addStateDelegate(relayToVisibleIndicator)
try {
runSingleTask(task, activity)

View File

@@ -43,7 +43,9 @@ class MergingQueueGuiSuspender {
}
}
fun <T> setCurrentSuspenderAndSuspendIfRequested(suspender: ProgressSuspender, runnable: Supplier<T>): T {
fun <T> setCurrentSuspenderAndSuspendIfRequested(suspender: ProgressSuspender?, runnable: Supplier<T>): T {
if (suspender == null) return runnable.get()
LOG.assertTrue(myCurrentSuspender == null, "Already suspended in another thread, or recursive invocation.")
return try {
myCurrentSuspender = suspender

View File

@@ -25,6 +25,7 @@ import com.intellij.openapi.progress.impl.ProgressManagerImpl
import com.intellij.openapi.progress.impl.ProgressSuspender
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.UserDataHolder
import com.intellij.openapi.wm.ex.ProgressIndicatorEx
import com.intellij.util.flow.throttle
import com.jetbrains.packagesearch.intellij.plugin.PackageSearchBundle
import com.jetbrains.packagesearch.intellij.plugin.data.LoadingContainer
@@ -214,7 +215,7 @@ internal suspend fun showBackgroundLoadingBar(
@Suppress("HardCodedStringLiteral")
val channelsJob = launch {
if (isPausable) {
ProgressSuspender.markSuspendable(indicator, PackageSearchBundle.message("packagesearch.ui.resume"))
ProgressSuspender.markSuspendable(indicator as ProgressIndicatorEx, PackageSearchBundle.message("packagesearch.ui.resume"))
.isSuspendedFLow
.collectIn(this, isSuspendedChannel)
}