diff --git a/plugins/kotlin/performance-tests/performance-test-utils/test/org/jetbrains/kotlin/idea/performance/tests/utils/project/ProjectOpenAction.kt b/plugins/kotlin/performance-tests/performance-test-utils/test/org/jetbrains/kotlin/idea/performance/tests/utils/project/ProjectOpenAction.kt index d11d80a30aa4..af86444507b8 100644 --- a/plugins/kotlin/performance-tests/performance-test-utils/test/org/jetbrains/kotlin/idea/performance/tests/utils/project/ProjectOpenAction.kt +++ b/plugins/kotlin/performance-tests/performance-test-utils/test/org/jetbrains/kotlin/idea/performance/tests/utils/project/ProjectOpenAction.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.application.runInEdt import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManagerImpl import com.intellij.openapi.module.ModuleManager +import com.intellij.openapi.progress.runBlockingCancellable import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project import com.intellij.openapi.project.ex.ProjectManagerEx @@ -175,7 +176,7 @@ enum class ProjectOpenAction { val checkerService = KotlinConfigurationCheckerService.getInstance(project) val writeActionContinuations = mutableListOf<() -> Unit>() - for (module in getModulesWithKotlinFiles(project)) { + for (module in runBlockingCancellable { getModulesWithKotlinFiles(project) }) { checkerService.getAndCacheLanguageLevelByDependencies(module, writeActionContinuations) } if (writeActionContinuations.isNotEmpty()) { diff --git a/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index 21e6b0e94644..513fc2536e16 100644 --- a/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -3,7 +3,7 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.externalSystem.JavaModuleData -import com.intellij.openapi.application.ReadAction +import com.intellij.openapi.application.readAction import com.intellij.openapi.application.runReadAction import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.extensions.Extensions @@ -12,6 +12,7 @@ import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleGrouper import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.progress.runBlockingMaybeCancellable import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project import com.intellij.openapi.project.guessProjectDir @@ -48,7 +49,6 @@ import org.jetbrains.kotlin.idea.base.util.module import org.jetbrains.kotlin.idea.base.util.projectScope import org.jetbrains.kotlin.idea.base.util.runReadActionInSmartMode import org.jetbrains.kotlin.idea.compiler.configuration.IdeKotlinVersion -import org.jetbrains.kotlin.idea.core.KotlinPluginDisposable import org.jetbrains.kotlin.idea.core.syncNonBlockingReadAction import org.jetbrains.kotlin.idea.projectConfiguration.KotlinNotConfiguredSuppressedModulesState import org.jetbrains.kotlin.idea.projectConfiguration.KotlinProjectConfigurationBundle @@ -145,20 +145,14 @@ fun isModuleConfigured(moduleSourceRootGroup: ModuleSourceRootGroup): Boolean { * DO NOT CALL THIS ON AWT THREAD */ @RequiresBackgroundThread -fun getModulesWithKotlinFiles(project: Project, modulesWithKotlinFacets: List? = null): Collection { +suspend fun getModulesWithKotlinFiles(project: Project, modulesWithKotlinFacets: List? = null): Collection { if (!isUnitTestMode() && isDispatchThread()) { LOG.error("getModulesWithKotlinFiles could be a heavy operation and should not be call on AWT thread") } - fun nonBlockingReadActionSync(block: () -> T): T { - return ReadAction.nonBlocking(block) - .expireWith(KotlinPluginDisposable.getInstance(project)) - .executeSynchronously() - } - val projectScope = project.projectScope() // nothing to configure if there is no Kotlin files in entire project - val anyKotlinFileInProject = nonBlockingReadActionSync { + val anyKotlinFileInProject = readAction { FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, projectScope) } if (!anyKotlinFileInProject) { @@ -169,7 +163,7 @@ fun getModulesWithKotlinFiles(project: Project, modulesWithKotlinFacets: List if (projectFileIndex.isInSourceContent(ktFile)) { @@ -180,7 +174,7 @@ fun getModulesWithKotlinFiles(project: Project, modulesWithKotlinFacets: List if (module.isDisposed) return@filterTo false @@ -196,7 +190,7 @@ fun getModulesWithKotlinFiles(project: Project, modulesWithKotlinFacets: List { - val modules = getModulesWithKotlinFiles(project) + val modules = runBlockingMaybeCancellable { getModulesWithKotlinFiles(project) } if (modules.isEmpty()) return emptyList() return ModuleSourceRootMap(project).groupByBaseModules(modules)