Get rid of getInstanceIfNotDisposed

Relates to #EA-216005
This commit is contained in:
Vladimir Dolzhenko
2020-04-01 17:17:26 +00:00
parent 55a98fc5df
commit 10df7ee31a
14 changed files with 71 additions and 51 deletions
@@ -98,8 +98,7 @@ class GradleMigrateTest : GradleImportingTestCase() {
} }
val importResult = FutureResult<MigrationTestState?>() val importResult = FutureResult<MigrationTestState?>()
val migrationProjectComponent = KotlinMigrationProjectService.getInstanceIfNotDisposed(myProject) val migrationProjectComponent = KotlinMigrationProjectService.getInstance(myProject)
?: error("Disposed project")
migrationProjectComponent.setImportFinishListener { migrationState -> migrationProjectComponent.setImportFinishListener { migrationState ->
importResult.set(migrationState) importResult.set(migrationState)
@@ -8,11 +8,13 @@ package org.jetbrains.kotlin.idea.actions.internal
import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerService import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerService
import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwareIndicator
class ReactivePostOpenProjectActionsAction : AnAction() { class ReactivePostOpenProjectActionsAction : AnAction() {
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return val project = e.project ?: return
val configurationChecker = KotlinConfigurationCheckerService.getInstanceIfNotDisposed(project) ?: return runUnderDisposeAwareIndicator(project) {
configurationChecker.performProjectPostOpenActions() KotlinConfigurationCheckerService.getInstance(project).performProjectPostOpenActions()
}
} }
} }
@@ -21,18 +21,23 @@ import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotifica
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerService import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerService
import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwareIndicator
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
KotlinMigrationProjectService.getInstanceIfNotDisposed(project)?.onImportAboutToStart() runUnderDisposeAwareIndicator(project) {
KotlinConfigurationCheckerService.getInstanceIfNotDisposed(project)?.syncStarted() KotlinMigrationProjectService.getInstance(project).onImportAboutToStart()
KotlinConfigurationCheckerService.getInstance(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
KotlinConfigurationCheckerService.getInstanceIfNotDisposed(project)?.syncDone() runUnderDisposeAwareIndicator(project) {
KotlinConfigurationCheckerService.getInstance(project).syncDone()
}
} }
} }
@@ -60,7 +60,7 @@ class KotlinSetupEnvironmentNotificationProvider(private val myProject: Project)
return createSetupSdkPanel(myProject, psiFile) return createSetupSdkPanel(myProject, psiFile)
} }
val configurationChecker = KotlinConfigurationCheckerService.getInstanceIfNotDisposed(module.project) ?: return null val configurationChecker = KotlinConfigurationCheckerService.getInstance(module.project)
if (!configurationChecker.isSyncing && if (!configurationChecker.isSyncing &&
isNotConfiguredNotificationRequired(module.toModuleGroup()) && isNotConfiguredNotificationRequired(module.toModuleGroup()) &&
@@ -81,14 +81,13 @@ 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 =
project.getComponent(KotlinConfigurationCheckerComponent::class.java)
?: error("Can't find ${KotlinConfigurationCheckerComponent::class} component")
fun getInstanceIfNotDisposed(project: Project): KotlinConfigurationCheckerComponent? { fun getInstanceIfNotDisposed(project: Project): KotlinConfigurationCheckerComponent? {
return runReadAction { return runReadAction {
if (!project.isDisposed) { if (!project.isDisposed) getInstance(project) else null
project.getComponent(KotlinConfigurationCheckerComponent::class.java)
?: error("Can't find ${KotlinConfigurationCheckerComponent::class} component")
} else {
null
}
} }
} }
} }
@@ -32,6 +32,8 @@ import org.jetbrains.kotlin.idea.configuration.getModulesWithKotlinFiles
import org.jetbrains.kotlin.idea.configuration.notifyOutdatedBundledCompilerIfNecessary import org.jetbrains.kotlin.idea.configuration.notifyOutdatedBundledCompilerIfNecessary
import org.jetbrains.kotlin.idea.configuration.ui.notifications.notifyKotlinStyleUpdateIfNeeded import org.jetbrains.kotlin.idea.configuration.ui.notifications.notifyKotlinStyleUpdateIfNeeded
import org.jetbrains.kotlin.idea.project.getAndCacheLanguageLevelByDependencies import org.jetbrains.kotlin.idea.project.getAndCacheLanguageLevelByDependencies
import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils
import org.jetbrains.kotlin.idea.util.application.getServiceSafe
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
import java.util.concurrent.Callable import java.util.concurrent.Callable
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
@@ -51,7 +53,7 @@ class KotlinConfigurationCheckerStartupActivity : StartupActivity {
notifyKotlinStyleUpdateIfNeeded(project) notifyKotlinStyleUpdateIfNeeded(project)
KotlinConfigurationCheckerService.getInstanceIfNotDisposed(project)?.performProjectPostOpenActions() KotlinConfigurationCheckerService.getInstance(project).performProjectPostOpenActions()
} }
} }
@@ -101,15 +103,7 @@ class KotlinConfigurationCheckerService(val project: Project) {
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 getInstanceIfNotDisposed(project: Project): KotlinConfigurationCheckerService? { fun getInstance(project: Project): KotlinConfigurationCheckerService = project.getServiceSafe()
return runReadAction {
if (!project.isDisposed) {
project.getService(KotlinConfigurationCheckerService::class.java)
?: error("Can't find ${KotlinConfigurationCheckerService::class} service")
} else {
null
}
}
}
} }
} }
@@ -12,14 +12,17 @@ import org.jetbrains.idea.maven.project.MavenProject
import org.jetbrains.idea.maven.project.MavenProjectsManager import org.jetbrains.idea.maven.project.MavenProjectsManager
import org.jetbrains.kotlin.idea.configuration.KotlinMigrationProjectService import org.jetbrains.kotlin.idea.configuration.KotlinMigrationProjectService
import org.jetbrains.kotlin.idea.configuration.notifyOutdatedBundledCompilerIfNecessary import org.jetbrains.kotlin.idea.configuration.notifyOutdatedBundledCompilerIfNecessary
import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwareIndicator
class MavenImportListener(val project: Project) : MavenProjectsManager.Listener { class MavenImportListener(val project: Project) : MavenProjectsManager.Listener {
init { init {
project.messageBus.connect().subscribe( project.messageBus.connect(project).subscribe(
MavenImportListener.TOPIC, MavenImportListener.TOPIC,
MavenImportListener { _: Collection<MavenProject>, _: List<Module> -> MavenImportListener { _: Collection<MavenProject>, _: List<Module> ->
notifyOutdatedBundledCompilerIfNecessary(project) runUnderDisposeAwareIndicator(project) {
KotlinMigrationProjectService.getInstanceIfNotDisposed(project)?.onImportFinished() notifyOutdatedBundledCompilerIfNecessary(project)
KotlinMigrationProjectService.getInstance(project).onImportFinished()
}
} }
) )
@@ -27,6 +30,8 @@ class MavenImportListener(val project: Project) : MavenProjectsManager.Listener
} }
override fun projectsScheduled() { override fun projectsScheduled() {
KotlinMigrationProjectService.getInstanceIfNotDisposed(project)?.onImportAboutToStart() runUnderDisposeAwareIndicator(project) {
KotlinMigrationProjectService.getInstance(project).onImportAboutToStart()
}
} }
} }
@@ -108,8 +108,7 @@ class MavenMigrateTest : MavenImportingTestCase() {
} }
val importResult = FutureResult<MigrationTestState?>() val importResult = FutureResult<MigrationTestState?>()
val migrationProjectComponent = KotlinMigrationProjectService.getInstanceIfNotDisposed(myProject) val migrationProjectComponent = KotlinMigrationProjectService.getInstance(myProject)
?: error("Disposed project")
migrationProjectComponent.setImportFinishListener { migrationState -> migrationProjectComponent.setImportFinishListener { migrationState ->
importResult.set(migrationState) importResult.set(migrationState)
@@ -8,13 +8,16 @@ package org.jetbrains.kotlin.idea.configuration
import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataImportListener import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataImportListener
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity import com.intellij.openapi.startup.StartupActivity
import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwareIndicator
class KotlinMigrationProjectComponent : StartupActivity { class KotlinMigrationProjectComponent : StartupActivity {
override fun runActivity(project: Project) { override fun runActivity(project: Project) {
val connection = project.messageBus.connect(project) val connection = project.messageBus.connect(project)
connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener { connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener {
KotlinMigrationProjectService.getInstanceIfNotDisposed(project)?.onImportFinished() runUnderDisposeAwareIndicator(project) {
KotlinMigrationProjectService.getInstance(project).onImportFinished()
}
}) })
} }
@@ -116,14 +116,13 @@ class KotlinMigrationProjectComponent(val project: Project) {
} }
companion object { companion object {
fun getInstance(project: Project): KotlinMigrationProjectComponent =
project.getComponent(KotlinMigrationProjectComponent::class.java)
?: error("Can't find ${KotlinMigrationProjectComponent::class.qualifiedName} component")
fun getInstanceIfNotDisposed(project: Project): KotlinMigrationProjectComponent? { fun getInstanceIfNotDisposed(project: Project): KotlinMigrationProjectComponent? {
return runReadAction { return runReadAction {
if (!project.isDisposed) { if (!project.isDisposed) getInstance(project) else null
project.getComponent(KotlinMigrationProjectComponent::class.java)
?: error("Can't find ${KotlinMigrationProjectComponent::class.qualifiedName} component")
} else {
null
}
} }
} }
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.configuration package org.jetbrains.kotlin.idea.configuration
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.ModuleManager
@@ -28,8 +27,7 @@ import org.jetbrains.kotlin.idea.framework.MAVEN_SYSTEM_ID
import org.jetbrains.kotlin.idea.migration.CodeMigrationToggleAction import org.jetbrains.kotlin.idea.migration.CodeMigrationToggleAction
import org.jetbrains.kotlin.idea.migration.applicableMigrationTools import org.jetbrains.kotlin.idea.migration.applicableMigrationTools
import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.util.application.getServiceSafe import org.jetbrains.kotlin.idea.util.application.*
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.runReadActionInSmartMode import org.jetbrains.kotlin.idea.util.runReadActionInSmartMode
import org.jetbrains.kotlin.idea.versions.LibInfo import org.jetbrains.kotlin.idea.versions.LibInfo
import java.io.File import java.io.File
@@ -75,7 +73,7 @@ class KotlinMigrationProjectService(val project: Project) {
return return
} }
ApplicationManager.getApplication().executeOnPooledThread { executeOnPooledThread {
var migrationInfo: MigrationInfo? = null var migrationInfo: MigrationInfo? = null
var hasApplicableTools = false var hasApplicableTools = false
@@ -97,11 +95,11 @@ class KotlinMigrationProjectService(val project: Project) {
hasApplicableTools = true hasApplicableTools = true
} }
if (ApplicationManager.getApplication().isUnitTestMode) { if (isUnitTestMode()) {
return@executeOnPooledThread return@executeOnPooledThread
} }
ApplicationManager.getApplication().invokeLater { invokeLater {
showMigrationNotification(project, migrationInfo) showMigrationNotification(project, migrationInfo)
} }
} finally { } finally {
@@ -111,11 +109,7 @@ class KotlinMigrationProjectService(val project: Project) {
} }
companion object { companion object {
fun getInstanceIfNotDisposed(project: Project): KotlinMigrationProjectService? { fun getInstance(project: Project): KotlinMigrationProjectService = project.getServiceSafe()
return runReadAction {
if (!project.isDisposed) project.getServiceSafe() 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) {
@@ -1,14 +1,17 @@
/* /*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.idea.util package org.jetbrains.kotlin.idea.util
import com.intellij.openapi.Disposable
import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.util.BackgroundTaskUtil
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Computable
import com.intellij.util.ExceptionUtil import com.intellij.util.ExceptionUtil
import org.jetbrains.annotations.Nls import org.jetbrains.annotations.Nls
import java.util.concurrent.CancellationException import java.util.concurrent.CancellationException
@@ -27,6 +30,11 @@ object ProgressIndicatorUtils {
computable: () -> T computable: () -> T
): T = com.intellij.openapi.actionSystem.ex.ActionUtil.underModalProgress(project, progressTitle, computable) ): T = com.intellij.openapi.actionSystem.ex.ActionUtil.underModalProgress(project, progressTitle, computable)
fun <T> runUnderDisposeAwareIndicator(
parent: Disposable,
computable: () -> T
): T = BackgroundTaskUtil.runUnderDisposeAwareIndicator(parent, Computable { computable() })
@JvmStatic @JvmStatic
fun <T> awaitWithCheckCanceled(future: Future<T>): T { fun <T> awaitWithCheckCanceled(future: Future<T>): T {
val indicator = ProgressManager.getInstance().progressIndicator val indicator = ProgressManager.getInstance().progressIndicator
@@ -5,9 +5,11 @@
package org.jetbrains.kotlin.idea.util package org.jetbrains.kotlin.idea.util
import com.intellij.openapi.Disposable
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.util.BackgroundTaskUtil
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Computable import com.intellij.openapi.util.Computable
@@ -36,6 +38,11 @@ object ProgressIndicatorUtils {
return ProgressManager.getInstance().runProcessWithProgressSynchronously(process, progressTitle, true, project) return ProgressManager.getInstance().runProcessWithProgressSynchronously(process, progressTitle, true, project)
} }
fun <T> runUnderDisposeAwareIndicator(
parent: Disposable,
computable: () -> T
): T = BackgroundTaskUtil.runUnderDisposeAwareIndicator(parent, Computable { computable() })
@JvmStatic @JvmStatic
fun <T> awaitWithCheckCanceled(future: Future<T>): T { fun <T> awaitWithCheckCanceled(future: Future<T>): T {
while (true) { while (true) {
@@ -50,5 +57,4 @@ object ProgressIndicatorUtils {
} }
} }
} }
} }
@@ -5,9 +5,11 @@
package org.jetbrains.kotlin.idea.util package org.jetbrains.kotlin.idea.util
import com.intellij.openapi.Disposable
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.util.BackgroundTaskUtil
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Computable import com.intellij.openapi.util.Computable
@@ -38,6 +40,11 @@ object ProgressIndicatorUtils {
return ProgressManager.getInstance().runProcessWithProgressSynchronously(process, progressTitle, true, project) return ProgressManager.getInstance().runProcessWithProgressSynchronously(process, progressTitle, true, project)
} }
fun <T> runUnderDisposeAwareIndicator(
parent: Disposable,
computable: () -> T
): T = BackgroundTaskUtil.runUnderDisposeAwareIndicator(parent, Computable { computable() })
@JvmStatic @JvmStatic
fun <T> awaitWithCheckCanceled(future: Future<T>): T { fun <T> awaitWithCheckCanceled(future: Future<T>): T {
while (true) { while (true) {