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.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<MigrationTestState?>()
val migrationProjectComponent = KotlinMigrationProjectComponent.getInstance(myProject)
val migrationProjectComponent = KotlinMigrationProjectComponent.getInstanceIfNotDisposed(myProject)
?: error("Disposed project")
migrationProjectComponent.setImportFinishListener { migrationState ->
importResult.set(migrationState)
@@ -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()
}
}
@@ -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()
@@ -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
}
}
}
}
}
@@ -19,7 +19,7 @@ class MavenImportListener(val project: Project) : MavenProjectsManager.Listener
MavenImportListener.TOPIC,
MavenImportListener { _: Collection<MavenProject>, _: List<Module> ->
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()
}
}
@@ -104,7 +104,8 @@ class MavenMigrateTest : MavenImportingTestCase() {
}
val importResult = FutureResult<KotlinMigrationProjectComponent.MigrationTestState?>()
val migrationProjectComponent = KotlinMigrationProjectComponent.getInstance(myProject)
val migrationProjectComponent = KotlinMigrationProjectComponent.getInstanceIfNotDisposed(myProject)
?: error("Disposed project")
migrationProjectComponent.setImportFinishListener { migrationState ->
importResult.set(migrationState)
@@ -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) {