Check element disposed before getting component in migration (EA-134713)

Check if it can reduce the exceptions rate and check for deeper exceptions.
This commit is contained in:
Nikolay Krasko
2019-01-25 16:08:48 +03:00
parent d1b7c0f683
commit 16ff522cd3
7 changed files with 38 additions and 15 deletions
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.test.testFramework.runInEdtAndWait
import org.jetbrains.plugins.gradle.tooling.annotation.TargetVersions import org.jetbrains.plugins.gradle.tooling.annotation.TargetVersions
import org.junit.Assert import org.junit.Assert
import org.junit.Test import org.junit.Test
import java.lang.IllegalStateException
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException import java.util.concurrent.TimeoutException
@@ -99,7 +98,8 @@ class GradleMigrateTest : GradleImportingTestCase() {
} }
val importResult = FutureResult<MigrationTestState?>() val importResult = FutureResult<MigrationTestState?>()
val migrationProjectComponent = KotlinMigrationProjectComponent.getInstance(myProject) val migrationProjectComponent = KotlinMigrationProjectComponent.getInstanceIfNotDisposed(myProject)
?: error("Disposed project")
migrationProjectComponent.setImportFinishListener { migrationState -> migrationProjectComponent.setImportFinishListener { migrationState ->
importResult.set(migrationState) importResult.set(migrationState)
@@ -25,14 +25,14 @@ import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerComp
class KotlinExternalSystemSyncListener : ExternalSystemTaskNotificationListenerAdapter() { class KotlinExternalSystemSyncListener : ExternalSystemTaskNotificationListenerAdapter() {
override fun onStart(id: ExternalSystemTaskId, workingDir: String) { override fun onStart(id: ExternalSystemTaskId, workingDir: String) {
val project = id.findResolvedProject() ?: return val project = id.findResolvedProject() ?: return
KotlinMigrationProjectComponent.getInstance(project).onImportAboutToStart() KotlinMigrationProjectComponent.getInstanceIfNotDisposed(project)?.onImportAboutToStart()
KotlinConfigurationCheckerComponent.getInstance(project).syncStarted() KotlinConfigurationCheckerComponent.getInstanceIfNotDisposed(project)?.syncStarted()
} }
override fun onEnd(id: ExternalSystemTaskId) { override fun onEnd(id: ExternalSystemTaskId) {
// At this point changes might be still not applied to project structure yet. // At this point changes might be still not applied to project structure yet.
val project = id.findResolvedProject() ?: return val project = id.findResolvedProject() ?: return
KotlinConfigurationCheckerComponent.getInstance(project).syncDone() KotlinConfigurationCheckerComponent.getInstanceIfNotDisposed(project)?.syncDone()
} }
} }
@@ -11,7 +11,10 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectBundle 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.roots.ui.configuration.ProjectSettingsService
import com.intellij.openapi.ui.popup.JBPopupFactory import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.ui.popup.ListPopup import com.intellij.openapi.ui.popup.ListPopup
@@ -69,7 +72,9 @@ class KotlinSetupEnvironmentNotificationProvider(
return createSetupSdkPanel(myProject, psiFile) return createSetupSdkPanel(myProject, psiFile)
} }
if (!KotlinConfigurationCheckerComponent.getInstance(module.project).isSyncing && val configurationCheckerComponent = KotlinConfigurationCheckerComponent.getInstanceIfNotDisposed(module.project) ?: return null
if (!configurationCheckerComponent.isSyncing &&
isNotConfiguredNotificationRequired(module.toModuleGroup()) && isNotConfiguredNotificationRequired(module.toModuleGroup()) &&
!hasAnyKotlinRuntimeInScope(module) && !hasAnyKotlinRuntimeInScope(module) &&
UnsupportedAbiVersionNotificationPanelProvider.collectBadRoots(module).isEmpty() UnsupportedAbiVersionNotificationPanelProvider.collectBadRoots(module).isEmpty()
@@ -20,6 +20,7 @@ import com.intellij.ProjectTopics
import com.intellij.notification.NotificationDisplayType import com.intellij.notification.NotificationDisplayType
import com.intellij.notification.NotificationsConfiguration import com.intellij.notification.NotificationsConfiguration
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.components.ProjectComponent import com.intellij.openapi.components.ProjectComponent
import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataImportListener import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataImportListener
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
@@ -117,7 +118,15 @@ class KotlinConfigurationCheckerComponent(val project: Project) : ProjectCompone
companion object { companion object {
const val CONFIGURE_NOTIFICATION_GROUP_ID = "Configure Kotlin in Project" const val CONFIGURE_NOTIFICATION_GROUP_ID = "Configure Kotlin in Project"
fun getInstance(project: Project): KotlinConfigurationCheckerComponent = fun getInstanceIfNotDisposed(project: Project): KotlinConfigurationCheckerComponent? {
project.getComponent(KotlinConfigurationCheckerComponent::class.java) return runReadAction {
if (!project.isDisposed) {
project.getComponent(KotlinConfigurationCheckerComponent::class.java)
?: error("Can't find ${KotlinConfigurationCheckerComponent::class} component")
} else {
null
}
}
}
} }
} }
@@ -19,7 +19,7 @@ class MavenImportListener(val project: Project) : MavenProjectsManager.Listener
MavenImportListener.TOPIC, MavenImportListener.TOPIC,
MavenImportListener { _: Collection<MavenProject>, _: List<Module> -> MavenImportListener { _: Collection<MavenProject>, _: List<Module> ->
notifyOutdatedBundledCompilerIfNecessary(project) notifyOutdatedBundledCompilerIfNecessary(project)
KotlinMigrationProjectComponent.getInstance(project).onImportFinished() KotlinMigrationProjectComponent.getInstanceIfNotDisposed(project)?.onImportFinished()
} }
) )
@@ -27,6 +27,6 @@ class MavenImportListener(val project: Project) : MavenProjectsManager.Listener
} }
override fun projectsScheduled() { override fun projectsScheduled() {
KotlinMigrationProjectComponent.getInstance(project).onImportAboutToStart() KotlinMigrationProjectComponent.getInstanceIfNotDisposed(project)?.onImportAboutToStart()
} }
} }
@@ -104,7 +104,8 @@ class MavenMigrateTest : MavenImportingTestCase() {
} }
val importResult = FutureResult<KotlinMigrationProjectComponent.MigrationTestState?>() val importResult = FutureResult<KotlinMigrationProjectComponent.MigrationTestState?>()
val migrationProjectComponent = KotlinMigrationProjectComponent.getInstance(myProject) val migrationProjectComponent = KotlinMigrationProjectComponent.getInstanceIfNotDisposed(myProject)
?: error("Disposed project")
migrationProjectComponent.setImportFinishListener { migrationState -> migrationProjectComponent.setImportFinishListener { migrationState ->
importResult.set(migrationState) importResult.set(migrationState)
@@ -44,7 +44,7 @@ class KotlinMigrationProjectComponent(val project: Project) {
init { init {
val connection = project.messageBus.connect() val connection = project.messageBus.connect()
connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener { connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener {
KotlinMigrationProjectComponent.getInstance(project).onImportFinished() KotlinMigrationProjectComponent.getInstanceIfNotDisposed(project)?.onImportFinished()
}) })
} }
@@ -116,8 +116,16 @@ class KotlinMigrationProjectComponent(val project: Project) {
} }
companion object { companion object {
fun getInstance(project: Project): KotlinMigrationProjectComponent = fun getInstanceIfNotDisposed(project: Project): KotlinMigrationProjectComponent? {
project.getComponent(KotlinMigrationProjectComponent::class.java)!! 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? { private fun prepareMigrationInfo(old: MigrationState?, new: MigrationState?): MigrationInfo? {
if (old == null || new == null) { if (old == null || new == null) {