diff --git a/idea/idea-jvm/resources/messages/KotlinJvmBundle.properties b/idea/idea-jvm/resources/messages/KotlinJvmBundle.properties
index 82dc33cea53..d900661d073 100644
--- a/idea/idea-jvm/resources/messages/KotlinJvmBundle.properties
+++ b/idea/idea-jvm/resources/messages/KotlinJvmBundle.properties
@@ -86,6 +86,8 @@ can.t.find.library.jar.file.0=Can''t find library JAR file {0}
0.library.was.added.to.module.1={0} library was added to module {1}
0.library.was.created={0} library was created
configure.kotlin=Configure Kotlin
+configure.kotlin.language.settings=Configure Kotlin language settings
+configure.kotlin.language.settings.0.module=Configure language settings in module {0}
configure.0.in.1.project.br.2=Configure {0} in ''{1}'' project
{2}
configure.0.module=''{0}'' module
configure.modules=modules
diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt
index 96b55dea0dc..14b9c179158 100644
--- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt
+++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt
@@ -133,7 +133,8 @@ fun getModulesWithKotlinFiles(project: Project): Collection {
if (!isUnitTestMode() && ApplicationManager.getApplication().isDispatchThread) {
LOG.error("getModulesWithKotlinFiles could be a heavy operation and should not be call on AWT thread")
}
- if (!runReadAction {
+
+ if (!project.runReadActionInSmartMode {
!project.isDisposed &&
FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, GlobalSearchScope.projectScope(project))
}) {
@@ -142,7 +143,7 @@ fun getModulesWithKotlinFiles(project: Project): Collection {
return project.allModules()
.filter { module ->
- runReadAction {
+ project.runReadActionInSmartMode {
!project.isDisposed && !module.isDisposed
&& FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(true))
}
diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt
index c9fa24fc480..d3e17be07aa 100644
--- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt
+++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt
@@ -18,23 +18,23 @@ package org.jetbrains.kotlin.idea.configuration.ui
import com.intellij.notification.NotificationDisplayType
import com.intellij.notification.NotificationsConfiguration
-import com.intellij.openapi.application.ApplicationManager
-import com.intellij.openapi.application.ModalityState
-import com.intellij.openapi.application.ReadAction.nonBlocking
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataImportListener
-import com.intellij.openapi.module.Module
+import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.ProgressManager
+import com.intellij.openapi.progress.Task
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
-import com.intellij.util.concurrency.AppExecutorUtil
-import org.jetbrains.kotlin.idea.configuration.getModulesWithKotlinFiles
+import com.intellij.psi.search.FileTypeIndex
+import com.intellij.psi.search.GlobalSearchScope
+import org.jetbrains.kotlin.idea.KotlinFileType
+import org.jetbrains.kotlin.idea.KotlinJvmBundle
import org.jetbrains.kotlin.idea.configuration.notifyOutdatedBundledCompilerIfNecessary
import org.jetbrains.kotlin.idea.configuration.ui.notifications.notifyKotlinStyleUpdateIfNeeded
import org.jetbrains.kotlin.idea.project.getAndCacheLanguageLevelByDependencies
import org.jetbrains.kotlin.idea.util.application.getServiceSafe
-import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
-import java.util.concurrent.Callable
+import org.jetbrains.kotlin.idea.util.projectStructure.allModules
+import org.jetbrains.kotlin.idea.util.runReadActionInSmartMode
import java.util.concurrent.atomic.AtomicInteger
class KotlinConfigurationCheckerStartupActivity : StartupActivity {
@@ -60,33 +60,37 @@ class KotlinConfigurationCheckerService(val project: Project) {
private val syncDepth = AtomicInteger()
fun performProjectPostOpenActions() {
- val callable = Callable {
- return@Callable getModulesWithKotlinFiles(project)
- }
+ val task = object : Task.Backgroundable(project, KotlinJvmBundle.message("configure.kotlin.language.settings"), true) {
+ override fun run(indicator: ProgressIndicator) {
+ val anyKotlinFileInProject = project.runReadActionInSmartMode {
+ !project.isDisposed &&
+ FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, GlobalSearchScope.projectScope(project))
+ }
+ if (!anyKotlinFileInProject) return
- fun continuation(modulesWithKotlinFiles: Collection) {
- for (module in modulesWithKotlinFiles) {
- ProgressManager.checkCanceled()
- runReadAction {
- module.getAndCacheLanguageLevelByDependencies()
+ val modules = runReadAction {
+ project.allModules()
+ }
+
+ val totalModules = modules.size
+
+ for ((index, module) in modules.withIndex()) {
+ indicator.fraction = index * 1.0 / totalModules
+
+ val anyKotlinFileInModule = project.runReadActionInSmartMode {
+ !project.isDisposed && !module.isDisposed
+ && FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(true))
+ }
+ if (anyKotlinFileInModule) {
+ indicator.text2 = KotlinJvmBundle.message("configure.kotlin.language.settings.0.module", module.name)
+ runReadAction {
+ module.getAndCacheLanguageLevelByDependencies()
+ }
+ }
}
}
}
-
- if (!isUnitTestMode()) {
- nonBlocking(callable)
- .inSmartMode(project)
- .expireWith(project)
- .coalesceBy(this)
- .finishOnUiThread(ModalityState.any()) { modulesWithKotlinFiles ->
- ApplicationManager.getApplication().executeOnPooledThread {
- continuation(modulesWithKotlinFiles)
- }
- }
- .submit(AppExecutorUtil.getAppExecutorService())
- } else {
- continuation(callable.call())
- }
+ ProgressManager.getInstance().run(task)
}
val isSyncing: Boolean get() = syncDepth.get() > 0