From 10df7ee31a1409501871be091a36e9f0ee0a0f84 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Wed, 1 Apr 2020 17:17:26 +0000 Subject: [PATCH] Get rid of getInstanceIfNotDisposed Relates to #EA-216005 --- .../idea/codeInsight/gradle/GradleMigrateTest.kt | 3 +-- .../ReactivePostOpenProjectActionsAction.kt | 6 ++++-- .../KotlinExternalSystemSyncListener.kt | 11 ++++++++--- ...KotlinSetupEnvironmentNotificationProvider.kt | 2 +- .../KotlinConfigurationCheckerComponent.kt.192 | 11 +++++------ .../ui/KotlinConfigurationCheckerService.kt | 16 +++++----------- .../kotlin/idea/maven/MavenImportListener.kt | 13 +++++++++---- .../kotlin/idea/maven/MavenMigrateTest.kt | 3 +-- .../KotlinMigrationProjectComponent.kt | 5 ++++- .../KotlinMigrationProjectComponent.kt.192 | 11 +++++------ .../KotlinMigrationProjectService.kt | 16 +++++----------- .../kotlin/idea/util/ProgressIndicatorUtils.kt | 10 +++++++++- .../idea/util/ProgressIndicatorUtils.kt.191 | 8 +++++++- .../idea/util/ProgressIndicatorUtils.kt.192 | 7 +++++++ 14 files changed, 71 insertions(+), 51 deletions(-) diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt index 37b57109026..15fc0f46e3d 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleMigrateTest.kt @@ -98,8 +98,7 @@ class GradleMigrateTest : GradleImportingTestCase() { } val importResult = FutureResult() - val migrationProjectComponent = KotlinMigrationProjectService.getInstanceIfNotDisposed(myProject) - ?: error("Disposed project") + val migrationProjectComponent = KotlinMigrationProjectService.getInstance(myProject) migrationProjectComponent.setImportFinishListener { migrationState -> importResult.set(migrationState) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/actions/internal/ReactivePostOpenProjectActionsAction.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/actions/internal/ReactivePostOpenProjectActionsAction.kt index 2c240015b87..c0cef29f99d 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/actions/internal/ReactivePostOpenProjectActionsAction.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/actions/internal/ReactivePostOpenProjectActionsAction.kt @@ -8,11 +8,13 @@ package org.jetbrains.kotlin.idea.actions.internal import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerService +import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwareIndicator class ReactivePostOpenProjectActionsAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { val project = e.project ?: return - val configurationChecker = KotlinConfigurationCheckerService.getInstanceIfNotDisposed(project) ?: return - configurationChecker.performProjectPostOpenActions() + runUnderDisposeAwareIndicator(project) { + KotlinConfigurationCheckerService.getInstance(project).performProjectPostOpenActions() + } } } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinExternalSystemSyncListener.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinExternalSystemSyncListener.kt index a073e50e7f8..bd9b506145d 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinExternalSystemSyncListener.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinExternalSystemSyncListener.kt @@ -21,18 +21,23 @@ import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotifica import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType import com.intellij.openapi.project.Project import org.jetbrains.kotlin.idea.configuration.ui.KotlinConfigurationCheckerService +import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwareIndicator class KotlinExternalSystemSyncListener : ExternalSystemTaskNotificationListenerAdapter() { override fun onStart(id: ExternalSystemTaskId, workingDir: String) { val project = id.findResolvedProject() ?: return - KotlinMigrationProjectService.getInstanceIfNotDisposed(project)?.onImportAboutToStart() - KotlinConfigurationCheckerService.getInstanceIfNotDisposed(project)?.syncStarted() + runUnderDisposeAwareIndicator(project) { + KotlinMigrationProjectService.getInstance(project).onImportAboutToStart() + KotlinConfigurationCheckerService.getInstance(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 - KotlinConfigurationCheckerService.getInstanceIfNotDisposed(project)?.syncDone() + runUnderDisposeAwareIndicator(project) { + KotlinConfigurationCheckerService.getInstance(project).syncDone() + } } } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt index 177a4ff12cc..4baf5058e73 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt @@ -60,7 +60,7 @@ class KotlinSetupEnvironmentNotificationProvider(private val myProject: Project) return createSetupSdkPanel(myProject, psiFile) } - val configurationChecker = KotlinConfigurationCheckerService.getInstanceIfNotDisposed(module.project) ?: return null + val configurationChecker = KotlinConfigurationCheckerService.getInstance(module.project) if (!configurationChecker.isSyncing && isNotConfiguredNotificationRequired(module.toModuleGroup()) && diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerComponent.kt.192 b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerComponent.kt.192 index 3ffb536b6d4..2fd9f57f5b3 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerComponent.kt.192 +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerComponent.kt.192 @@ -81,14 +81,13 @@ 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) + ?: error("Can't find ${KotlinConfigurationCheckerComponent::class} component") + fun getInstanceIfNotDisposed(project: Project): KotlinConfigurationCheckerComponent? { return runReadAction { - if (!project.isDisposed) { - project.getComponent(KotlinConfigurationCheckerComponent::class.java) - ?: error("Can't find ${KotlinConfigurationCheckerComponent::class} component") - } else { - null - } + if (!project.isDisposed) getInstance(project) else null } } } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt index a9a4afcb018..7b6c266babc 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt @@ -32,6 +32,8 @@ import org.jetbrains.kotlin.idea.configuration.getModulesWithKotlinFiles import org.jetbrains.kotlin.idea.configuration.notifyOutdatedBundledCompilerIfNecessary import org.jetbrains.kotlin.idea.configuration.ui.notifications.notifyKotlinStyleUpdateIfNeeded 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 java.util.concurrent.Callable import java.util.concurrent.atomic.AtomicInteger @@ -51,7 +53,7 @@ class KotlinConfigurationCheckerStartupActivity : StartupActivity { notifyKotlinStyleUpdateIfNeeded(project) - KotlinConfigurationCheckerService.getInstanceIfNotDisposed(project)?.performProjectPostOpenActions() + KotlinConfigurationCheckerService.getInstance(project).performProjectPostOpenActions() } } @@ -101,15 +103,7 @@ class KotlinConfigurationCheckerService(val project: Project) { companion object { const val CONFIGURE_NOTIFICATION_GROUP_ID = "Configure Kotlin in Project" - fun getInstanceIfNotDisposed(project: Project): KotlinConfigurationCheckerService? { - return runReadAction { - if (!project.isDisposed) { - project.getService(KotlinConfigurationCheckerService::class.java) - ?: error("Can't find ${KotlinConfigurationCheckerService::class} service") - } else { - null - } - } - } + fun getInstance(project: Project): KotlinConfigurationCheckerService = project.getServiceSafe() + } } diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/MavenImportListener.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/MavenImportListener.kt index 938d3635302..c48baf39f75 100644 --- a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/MavenImportListener.kt +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/MavenImportListener.kt @@ -12,14 +12,17 @@ import org.jetbrains.idea.maven.project.MavenProject import org.jetbrains.idea.maven.project.MavenProjectsManager import org.jetbrains.kotlin.idea.configuration.KotlinMigrationProjectService import org.jetbrains.kotlin.idea.configuration.notifyOutdatedBundledCompilerIfNecessary +import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwareIndicator class MavenImportListener(val project: Project) : MavenProjectsManager.Listener { init { - project.messageBus.connect().subscribe( + project.messageBus.connect(project).subscribe( MavenImportListener.TOPIC, MavenImportListener { _: Collection, _: List -> - notifyOutdatedBundledCompilerIfNecessary(project) - KotlinMigrationProjectService.getInstanceIfNotDisposed(project)?.onImportFinished() + runUnderDisposeAwareIndicator(project) { + notifyOutdatedBundledCompilerIfNecessary(project) + KotlinMigrationProjectService.getInstance(project).onImportFinished() + } } ) @@ -27,6 +30,8 @@ class MavenImportListener(val project: Project) : MavenProjectsManager.Listener } override fun projectsScheduled() { - KotlinMigrationProjectService.getInstanceIfNotDisposed(project)?.onImportAboutToStart() + runUnderDisposeAwareIndicator(project) { + KotlinMigrationProjectService.getInstance(project).onImportAboutToStart() + } } } \ No newline at end of file diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt index 290a5c319fd..72936273a27 100644 --- a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt +++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/MavenMigrateTest.kt @@ -108,8 +108,7 @@ class MavenMigrateTest : MavenImportingTestCase() { } val importResult = FutureResult() - val migrationProjectComponent = KotlinMigrationProjectService.getInstanceIfNotDisposed(myProject) - ?: error("Disposed project") + val migrationProjectComponent = KotlinMigrationProjectService.getInstance(myProject) migrationProjectComponent.setImportFinishListener { migrationState -> importResult.set(migrationState) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt index 973a6431f73..1406daf0ecf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt @@ -8,13 +8,16 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataImportListener import com.intellij.openapi.project.Project import com.intellij.openapi.startup.StartupActivity +import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwareIndicator class KotlinMigrationProjectComponent : StartupActivity { override fun runActivity(project: Project) { val connection = project.messageBus.connect(project) connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener { - KotlinMigrationProjectService.getInstanceIfNotDisposed(project)?.onImportFinished() + runUnderDisposeAwareIndicator(project) { + KotlinMigrationProjectService.getInstance(project).onImportFinished() + } }) } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt.192 b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt.192 index 784ac750bff..1aaa4a63470 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt.192 +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt.192 @@ -116,14 +116,13 @@ class KotlinMigrationProjectComponent(val project: Project) { } 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? { return runReadAction { - if (!project.isDisposed) { - project.getComponent(KotlinMigrationProjectComponent::class.java) - ?: error("Can't find ${KotlinMigrationProjectComponent::class.qualifiedName} component") - } else { - null - } + if (!project.isDisposed) getInstance(project) else null } } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectService.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectService.kt index 6f7947146be..c1b9849a971 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectService.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectService.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.idea.configuration -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.module.Module 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.applicableMigrationTools import org.jetbrains.kotlin.idea.project.languageVersionSettings -import org.jetbrains.kotlin.idea.util.application.getServiceSafe -import org.jetbrains.kotlin.idea.util.application.runReadAction +import org.jetbrains.kotlin.idea.util.application.* import org.jetbrains.kotlin.idea.util.runReadActionInSmartMode import org.jetbrains.kotlin.idea.versions.LibInfo import java.io.File @@ -75,7 +73,7 @@ class KotlinMigrationProjectService(val project: Project) { return } - ApplicationManager.getApplication().executeOnPooledThread { + executeOnPooledThread { var migrationInfo: MigrationInfo? = null var hasApplicableTools = false @@ -97,11 +95,11 @@ class KotlinMigrationProjectService(val project: Project) { hasApplicableTools = true } - if (ApplicationManager.getApplication().isUnitTestMode) { + if (isUnitTestMode()) { return@executeOnPooledThread } - ApplicationManager.getApplication().invokeLater { + invokeLater { showMigrationNotification(project, migrationInfo) } } finally { @@ -111,11 +109,7 @@ class KotlinMigrationProjectService(val project: Project) { } companion object { - fun getInstanceIfNotDisposed(project: Project): KotlinMigrationProjectService? { - return runReadAction { - if (!project.isDisposed) project.getServiceSafe() else null - } - } + fun getInstance(project: Project): KotlinMigrationProjectService = project.getServiceSafe() private fun prepareMigrationInfo(old: MigrationState?, new: MigrationState?): MigrationInfo? { if (old == null || new == null) { diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt index b0318c7a0ca..8d9d807fc99 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt @@ -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. */ package org.jetbrains.kotlin.idea.util +import com.intellij.openapi.Disposable import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.progress.util.BackgroundTaskUtil import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Computable import com.intellij.util.ExceptionUtil import org.jetbrains.annotations.Nls import java.util.concurrent.CancellationException @@ -27,6 +30,11 @@ object ProgressIndicatorUtils { computable: () -> T ): T = com.intellij.openapi.actionSystem.ex.ActionUtil.underModalProgress(project, progressTitle, computable) + fun runUnderDisposeAwareIndicator( + parent: Disposable, + computable: () -> T + ): T = BackgroundTaskUtil.runUnderDisposeAwareIndicator(parent, Computable { computable() }) + @JvmStatic fun awaitWithCheckCanceled(future: Future): T { val indicator = ProgressManager.getInstance().progressIndicator diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.191 b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.191 index e35ee37dadc..5fcc66d5313 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.191 +++ b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.191 @@ -5,9 +5,11 @@ package org.jetbrains.kotlin.idea.util +import com.intellij.openapi.Disposable import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.progress.util.BackgroundTaskUtil import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project import com.intellij.openapi.util.Computable @@ -36,6 +38,11 @@ object ProgressIndicatorUtils { return ProgressManager.getInstance().runProcessWithProgressSynchronously(process, progressTitle, true, project) } + fun runUnderDisposeAwareIndicator( + parent: Disposable, + computable: () -> T + ): T = BackgroundTaskUtil.runUnderDisposeAwareIndicator(parent, Computable { computable() }) + @JvmStatic fun awaitWithCheckCanceled(future: Future): T { while (true) { @@ -50,5 +57,4 @@ object ProgressIndicatorUtils { } } } - } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.192 b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.192 index b2c485f9383..0af220d261a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.192 +++ b/idea/src/org/jetbrains/kotlin/idea/util/ProgressIndicatorUtils.kt.192 @@ -5,9 +5,11 @@ package org.jetbrains.kotlin.idea.util +import com.intellij.openapi.Disposable import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.progress.util.BackgroundTaskUtil import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project import com.intellij.openapi.util.Computable @@ -38,6 +40,11 @@ object ProgressIndicatorUtils { return ProgressManager.getInstance().runProcessWithProgressSynchronously(process, progressTitle, true, project) } + fun runUnderDisposeAwareIndicator( + parent: Disposable, + computable: () -> T + ): T = BackgroundTaskUtil.runUnderDisposeAwareIndicator(parent, Computable { computable() }) + @JvmStatic fun awaitWithCheckCanceled(future: Future): T { while (true) {