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