Fix freeze on configure kotlin for the project
#KT-30541 Fixed #KT-36289 Fixed
This commit is contained in:
@@ -73,6 +73,8 @@ configure=Configure
|
||||
kotlin.not.configured=Kotlin not configured
|
||||
there.aren.t.configurators.available=There aren't configurators available
|
||||
all.modules.with.kotlin.files.are.configured=All modules with Kotlin files are configured
|
||||
lookup.project.configurators.progress.text=Looking up for project configurators ...
|
||||
lookup.modules.configurations.progress.text=Looking up for modules configurations ...
|
||||
added.0.requirement.to.module.info.in.1=Added {0} requirement to module-info in {1}
|
||||
updated.javascript.libraries.in.module.0=Updated JavaScript libraries in module {0}
|
||||
added.0.to.library.configuration=Added {0} to library configuration
|
||||
|
||||
+10
-3
@@ -12,6 +12,7 @@ import com.intellij.openapi.ui.Messages
|
||||
import com.intellij.util.PlatformUtils
|
||||
import org.jetbrains.kotlin.idea.KotlinJvmBundle
|
||||
import org.jetbrains.kotlin.idea.configuration.*
|
||||
import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.underModalProgress
|
||||
import org.jetbrains.kotlin.idea.util.projectStructure.allModules
|
||||
import org.jetbrains.kotlin.platform.js.isJs
|
||||
import org.jetbrains.kotlin.platform.jvm.isJvm
|
||||
@@ -23,14 +24,20 @@ abstract class ConfigureKotlinInProjectAction : AnAction() {
|
||||
override fun actionPerformed(e: AnActionEvent) {
|
||||
val project = e.project ?: return
|
||||
|
||||
val modules = getConfigurableModules(project)
|
||||
val (modules, configurators) = underModalProgress(project, KotlinJvmBundle.message("lookup.project.configurators.progress.text")) {
|
||||
val modules = getConfigurableModules(project)
|
||||
if (modules.all(::isModuleConfigured)) {
|
||||
return@underModalProgress modules to emptyList<KotlinProjectConfigurator>()
|
||||
}
|
||||
val configurators = getApplicableConfigurators(project)
|
||||
modules to configurators
|
||||
}
|
||||
|
||||
if (modules.all(::isModuleConfigured)) {
|
||||
Messages.showInfoMessage(KotlinJvmBundle.message("all.modules.with.kotlin.files.are.configured"), e.presentation.text!!)
|
||||
return
|
||||
}
|
||||
|
||||
val configurators = getApplicableConfigurators(project)
|
||||
|
||||
when {
|
||||
configurators.size == 1 -> configurators.first().configure(project, emptyList())
|
||||
configurators.isEmpty() -> Messages.showErrorDialog(
|
||||
|
||||
+10
@@ -5,7 +5,9 @@
|
||||
|
||||
package org.jetbrains.kotlin.idea.configuration
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.command.WriteCommandAction
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import com.intellij.openapi.extensions.Extensions
|
||||
import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.project.Project
|
||||
@@ -28,6 +30,7 @@ import org.jetbrains.kotlin.idea.core.util.getKotlinJvmRuntimeMarkerClass
|
||||
import org.jetbrains.kotlin.idea.framework.JSLibraryKind
|
||||
import org.jetbrains.kotlin.idea.framework.effectiveKind
|
||||
import org.jetbrains.kotlin.idea.quickfix.KotlinAddRequiredModuleFix
|
||||
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
|
||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||
import org.jetbrains.kotlin.idea.util.findFirstPsiJavaModule
|
||||
import org.jetbrains.kotlin.idea.util.isDev
|
||||
@@ -42,6 +45,8 @@ import org.jetbrains.kotlin.idea.vfilefinder.IDEVirtualFileFinder
|
||||
import org.jetbrains.kotlin.resolve.jvm.modules.KOTLIN_STDLIB_MODULE_NAME
|
||||
import org.jetbrains.kotlin.utils.ifEmpty
|
||||
|
||||
private val LOG = Logger.getInstance("#org.jetbrains.kotlin.idea.configuration.ConfigureKotlinInProjectUtils")
|
||||
|
||||
data class RepositoryDescription(val id: String, val name: String, val url: String, val bintrayUrl: String?, val isSnapshot: Boolean)
|
||||
|
||||
const val LAST_SNAPSHOT_VERSION = "1.4-SNAPSHOT"
|
||||
@@ -122,8 +127,13 @@ fun isModuleConfigured(moduleSourceRootGroup: ModuleSourceRootGroup): Boolean {
|
||||
/**
|
||||
* Returns a list of modules which contain sources in Kotlin.
|
||||
* Note that this method is expensive and should not be called more often than strictly necessary.
|
||||
*
|
||||
* DO NOT CALL THIS ON AWT THREAD
|
||||
*/
|
||||
fun getModulesWithKotlinFiles(project: Project): Collection<Module> {
|
||||
if (!isUnitTestMode() && ApplicationManager.getApplication().isDispatchThread) {
|
||||
LOG.error("getModulesWithKotlinFiles could be a heavy operation and should not be call on AWT thread")
|
||||
}
|
||||
if (!runReadAction {
|
||||
!project.isDisposed &&
|
||||
FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, GlobalSearchScope.projectScope(project))
|
||||
|
||||
+1
-4
@@ -20,10 +20,7 @@ import kotlin.reflect.KClass
|
||||
|
||||
object ConfigureKotlinNotificationManager : KotlinSingleNotificationManager<ConfigureKotlinNotification> {
|
||||
fun notify(project: Project, excludeModules: List<Module> = emptyList()) {
|
||||
val notificationState = ConfigureKotlinNotification.getNotificationState(project, excludeModules)
|
||||
if (notificationState != null) {
|
||||
notify(project, ConfigureKotlinNotification(project, excludeModules, notificationState))
|
||||
}
|
||||
notify(this, project, excludeModules)
|
||||
}
|
||||
|
||||
fun getVisibleNotifications(project: Project): Array<out ConfigureKotlinNotification> {
|
||||
|
||||
+9
-4
@@ -30,6 +30,8 @@ import org.jetbrains.kotlin.idea.facet.toApiVersion
|
||||
import org.jetbrains.kotlin.idea.framework.ui.CreateLibraryDialogWithModules
|
||||
import org.jetbrains.kotlin.idea.framework.ui.FileUIUtils
|
||||
import org.jetbrains.kotlin.idea.quickfix.askUpdateRuntime
|
||||
import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.underModalProgress
|
||||
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
|
||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||
import org.jetbrains.kotlin.idea.util.projectStructure.sdk
|
||||
import org.jetbrains.kotlin.idea.versions.LibraryJarDescriptor
|
||||
@@ -68,10 +70,13 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
||||
val defaultPathToJar = getDefaultPathToJarFile(project)
|
||||
val showPathToJarPanel = needToChooseJarPath(project)
|
||||
|
||||
var nonConfiguredModules = if (!ApplicationManager.getApplication().isUnitTestMode)
|
||||
getCanBeConfiguredModules(project, this)
|
||||
else
|
||||
var nonConfiguredModules = if (!isUnitTestMode()) {
|
||||
underModalProgress(project, KotlinJvmBundle.message("lookup.modules.configurations.progress.text")) {
|
||||
getCanBeConfiguredModules(project, this)
|
||||
}
|
||||
} else {
|
||||
listOf(*ModuleManager.getInstance(project).modules)
|
||||
}
|
||||
nonConfiguredModules -= excludeModules
|
||||
|
||||
var modulesToConfigure = nonConfiguredModules
|
||||
@@ -85,7 +90,7 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
||||
excludeModules
|
||||
)
|
||||
|
||||
if (!ApplicationManager.getApplication().isUnitTestMode) {
|
||||
if (!isUnitTestMode()) {
|
||||
dialog.show()
|
||||
if (!dialog.isOK) return
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.configuration
|
||||
|
||||
import com.intellij.openapi.application.ModalityState
|
||||
import com.intellij.openapi.application.ReadAction.nonBlocking
|
||||
import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.util.concurrency.AppExecutorUtil
|
||||
import org.jetbrains.kotlin.idea.configuration.ui.notifications.ConfigureKotlinNotification
|
||||
import java.util.concurrent.Callable
|
||||
|
||||
fun notify(manager: ConfigureKotlinNotificationManager, project: Project, excludeModules: List<Module>) {
|
||||
nonBlocking(Callable {
|
||||
ConfigureKotlinNotification.getNotificationState(project, excludeModules)
|
||||
})
|
||||
.expireWith(project)
|
||||
.coalesceBy(manager)
|
||||
.finishOnUiThread(ModalityState.any()) { notificationState ->
|
||||
notificationState?.let {
|
||||
manager.notify(project, ConfigureKotlinNotification(project, excludeModules, it))
|
||||
}
|
||||
}
|
||||
.submit(AppExecutorUtil.getAppExecutorService())
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.configuration
|
||||
|
||||
import com.intellij.openapi.application.ModalityState
|
||||
import com.intellij.openapi.application.ReadAction.nonBlocking
|
||||
import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.util.concurrency.AppExecutorUtil
|
||||
import org.jetbrains.kotlin.idea.configuration.ui.notifications.ConfigureKotlinNotification
|
||||
import java.util.concurrent.Callable
|
||||
|
||||
fun notify(manager: ConfigureKotlinNotificationManager, project: Project, excludeModules: List<Module>) {
|
||||
nonBlocking(Callable {
|
||||
ConfigureKotlinNotification.getNotificationState(project, excludeModules)
|
||||
})
|
||||
.expireWith(project)
|
||||
.finishOnUiThread(ModalityState.any()) { notificationState ->
|
||||
notificationState?.let {
|
||||
manager.notify(project, ConfigureKotlinNotification(project, excludeModules, it))
|
||||
}
|
||||
}
|
||||
.submit(AppExecutorUtil.getAppExecutorService())
|
||||
}
|
||||
Reference in New Issue
Block a user