From 13c07914d9453920b8eb67a0278cbe7d8a7726eb Mon Sep 17 00:00:00 2001 From: Ivan Posti Date: Mon, 30 Oct 2023 13:33:54 +0100 Subject: [PATCH] [Grazie][IDEA-318518] Add blockingContext for SimpleWordList constructor calls SimpleWordList uses plain checkCanceled in the initialization of its fields. GitOrigin-RevId: fd751562ae94a301d85f01bad1d753c8b3c30eba --- .../grazie/async/WordListLoader.kt | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/spellchecker/src/com/intellij/spellchecker/grazie/async/WordListLoader.kt b/spellchecker/src/com/intellij/spellchecker/grazie/async/WordListLoader.kt index b7171ae2fea5..ce0d2bef0696 100644 --- a/spellchecker/src/com/intellij/spellchecker/grazie/async/WordListLoader.kt +++ b/spellchecker/src/com/intellij/spellchecker/grazie/async/WordListLoader.kt @@ -6,18 +6,15 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.EDT import com.intellij.openapi.diagnostic.debug import com.intellij.openapi.diagnostic.logger -import com.intellij.openapi.progress.blockingContext import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.progress.blockingContext import com.intellij.openapi.project.Project import com.intellij.openapi.startup.StartupManager import com.intellij.spellchecker.dictionary.Loader import com.intellij.spellchecker.grazie.dictionary.SimpleWordList import com.intellij.util.containers.CollectionFactory import com.intellij.util.containers.ContainerUtil -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* import java.util.concurrent.atomic.AtomicBoolean private val LOG = logger() @@ -49,13 +46,21 @@ internal class WordListLoader(private val project: Project, private val coroutin coroutineScope.launch { LOG.debug("${loader} loaded!") - consumer(loader.name, SimpleWordList(readAll(loader))) + + val list = blockingContext { // makes checkCanceled() work inside constructor + SimpleWordList(readAll(loader)) + } + consumer(loader.name, list) while (listsToLoad.isNotEmpty()) { - ProgressManager.checkCanceled() + ensureActive() // checkCanceled does not work in a coroutine + // ProgressManager.checkCanceled() val (curLoader, currentConsumer) = listsToLoad.removeAt(0) LOG.debug("${curLoader.name} loaded!") - currentConsumer(curLoader.name, SimpleWordList(readAll(curLoader))) + val simpleWordList = blockingContext { // makes checkCanceled() work inside constructor + SimpleWordList(readAll(curLoader)) + } + currentConsumer(curLoader.name, simpleWordList) } LOG.debug("Loading finished, restarting daemon...")