[Grazie][IDEA-318518] Add blockingContext for SimpleWordList constructor calls

SimpleWordList uses plain checkCanceled in the initialization of its fields.

GitOrigin-RevId: fd751562ae94a301d85f01bad1d753c8b3c30eba
This commit is contained in:
Ivan Posti
2023-10-30 13:33:54 +01:00
committed by intellij-monorepo-bot
parent 5069eb8448
commit 13c07914d9

View File

@@ -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<WordListLoader>()
@@ -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...")