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:
+2
-2
@@ -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)
|
||||
|
||||
+3
-3
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+7
-2
@@ -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()
|
||||
|
||||
+11
-2
@@ -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)
|
||||
|
||||
+11
-3
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user