diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt index 1a039bf31ca..bdddb22abf0 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.test.testFramework.runInEdtAndWait import org.jetbrains.plugins.gradle.tooling.annotation.TargetVersions import org.junit.Assert import org.junit.Test -import java.lang.IllegalStateException import java.util.concurrent.TimeUnit import java.util.concurrent.TimeoutException @@ -99,7 +98,8 @@ class GradleMigrateTest : GradleImportingTestCase() { } val importResult = FutureResult() - val migrationProjectComponent = KotlinMigrationProjectComponent.getInstance(myProject) + val migrationProjectComponent = KotlinMigrationProjectComponent.getInstanceIfNotDisposed(myProject) + ?: error("Disposed project") migrationProjectComponent.setImportFinishListener { migrationState -> importResult.set(migrationState) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinExternalSystemSyncListener.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinExternalSystemSyncListener.kt index 4a991c1835a..ad3777f9951 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinExternalSystemSyncListener.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinExternalSystemSyncListener.kt @@ -25,14 +25,14 @@ import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerComp class KotlinExternalSystemSyncListener : ExternalSystemTaskNotificationListenerAdapter() { override fun onStart(id: ExternalSystemTaskId, workingDir: String) { val project = id.findResolvedProject() ?: return - KotlinMigrationProjectComponent.getInstance(project).onImportAboutToStart() - KotlinConfigurationCheckerComponent.getInstance(project).syncStarted() + KotlinMigrationProjectComponent.getInstanceIfNotDisposed(project)?.onImportAboutToStart() + KotlinConfigurationCheckerComponent.getInstanceIfNotDisposed(project)?.syncStarted() } override fun onEnd(id: ExternalSystemTaskId) { // At this point changes might be still not applied to project structure yet. val project = id.findResolvedProject() ?: return - KotlinConfigurationCheckerComponent.getInstance(project).syncDone() + KotlinConfigurationCheckerComponent.getInstanceIfNotDisposed(project)?.syncDone() } } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt index 5a2add28b6d..669210ce53b 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt @@ -11,7 +11,10 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectBundle -import com.intellij.openapi.roots.* +import com.intellij.openapi.roots.ModuleRootEvent +import com.intellij.openapi.roots.ModuleRootListener +import com.intellij.openapi.roots.ModuleRootManager +import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService import com.intellij.openapi.ui.popup.JBPopupFactory import com.intellij.openapi.ui.popup.ListPopup @@ -69,7 +72,9 @@ class KotlinSetupEnvironmentNotificationProvider( return createSetupSdkPanel(myProject, psiFile) } - if (!KotlinConfigurationCheckerComponent.getInstance(module.project).isSyncing && + val configurationCheckerComponent = KotlinConfigurationCheckerComponent.getInstanceIfNotDisposed(module.project) ?: return null + + if (!configurationCheckerComponent.isSyncing && isNotConfiguredNotificationRequired(module.toModuleGroup()) && !hasAnyKotlinRuntimeInScope(module) && UnsupportedAbiVersionNotificationPanelProvider.collectBadRoots(module).isEmpty() diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerComponent.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerComponent.kt index 4997005f30f..77128eab2e8 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerComponent.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerComponent.kt @@ -20,6 +20,7 @@ import com.intellij.ProjectTopics import com.intellij.notification.NotificationDisplayType import com.intellij.notification.NotificationsConfiguration import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.runReadAction import com.intellij.openapi.components.ProjectComponent import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataImportListener import com.intellij.openapi.project.DumbService @@ -117,7 +118,15 @@ class KotlinConfigurationCheckerComponent(val project: Project) : ProjectCompone companion object { const val CONFIGURE_NOTIFICATION_GROUP_ID = "Configure Kotlin in Project" - fun getInstance(project: Project): KotlinConfigurationCheckerComponent = - project.getComponent(KotlinConfigurationCheckerComponent::class.java) + fun getInstanceIfNotDisposed(project: Project): KotlinConfigurationCheckerComponent? { + return runReadAction { + if (!project.isDisposed) { + project.getComponent(KotlinConfigurationCheckerComponent::class.java) + ?: error("Can't find ${KotlinConfigurationCheckerComponent::class} component") + } else { + null + } + } + } } } diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/MavenImportListener.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/MavenImportListener.kt index 69065e8f3e3..825308780f4 100644 --- a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/MavenImportListener.kt +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/MavenImportListener.kt @@ -19,7 +19,7 @@ class MavenImportListener(val project: Project) : MavenProjectsManager.Listener MavenImportListener.TOPIC, MavenImportListener { _: Collection, _: List -> notifyOutdatedBundledCompilerIfNecessary(project) - KotlinMigrationProjectComponent.getInstance(project).onImportFinished() + KotlinMigrationProjectComponent.getInstanceIfNotDisposed(project)?.onImportFinished() } ) @@ -27,6 +27,6 @@ class MavenImportListener(val project: Project) : MavenProjectsManager.Listener } override fun projectsScheduled() { - KotlinMigrationProjectComponent.getInstance(project).onImportAboutToStart() + KotlinMigrationProjectComponent.getInstanceIfNotDisposed(project)?.onImportAboutToStart() } } \ No newline at end of file diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt index 2c5f0514916..cf4d8c4b570 100644 --- a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt +++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt @@ -104,7 +104,8 @@ class MavenMigrateTest : MavenImportingTestCase() { } val importResult = FutureResult() - val migrationProjectComponent = KotlinMigrationProjectComponent.getInstance(myProject) + val migrationProjectComponent = KotlinMigrationProjectComponent.getInstanceIfNotDisposed(myProject) + ?: error("Disposed project") migrationProjectComponent.setImportFinishListener { migrationState -> importResult.set(migrationState) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt index 56e55865e5a..3f8a83c9cbe 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt @@ -44,7 +44,7 @@ class KotlinMigrationProjectComponent(val project: Project) { init { val connection = project.messageBus.connect() connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener { - KotlinMigrationProjectComponent.getInstance(project).onImportFinished() + KotlinMigrationProjectComponent.getInstanceIfNotDisposed(project)?.onImportFinished() }) } @@ -116,8 +116,16 @@ class KotlinMigrationProjectComponent(val project: Project) { } companion object { - fun getInstance(project: Project): KotlinMigrationProjectComponent = - project.getComponent(KotlinMigrationProjectComponent::class.java)!! + fun getInstanceIfNotDisposed(project: Project): KotlinMigrationProjectComponent? { + return runReadAction { + if (!project.isDisposed) { + project.getComponent(KotlinMigrationProjectComponent::class.java) + ?: error("Can't find ${KotlinMigrationProjectComponent::class.qualifiedName} component") + } else { + null + } + } + } private fun prepareMigrationInfo(old: MigrationState?, new: MigrationState?): MigrationInfo? { if (old == null || new == null) {