Add utility for EDT coroutines to be canceled on project disposal

This commit is contained in:
Pavel V. Talanov
2017-07-28 19:34:47 +03:00
parent 7ca1fe0f55
commit 7f361c7579
2 changed files with 24 additions and 0 deletions
@@ -16,9 +16,14 @@
package org.jetbrains.kotlin.idea.core.util
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import kotlinx.coroutines.experimental.CoroutineDispatcher
import kotlinx.coroutines.experimental.Job
import kotlin.coroutines.experimental.AbstractCoroutineContextElement
import kotlin.coroutines.experimental.CoroutineContext
@@ -36,4 +41,20 @@ public object EDT : CoroutineDispatcher() {
class ModalityStateElement(val modalityState: ModalityState) : AbstractCoroutineContextElement(Key) {
companion object Key : CoroutineContext.Key<ModalityStateElement>
}
operator fun invoke(project: Project) = this + project.cancelOnDisposal
}
// job that is cancelled when the project is disposed
val Project.cancelOnDisposal: Job
get() = service<ProjectJob>().sharedJob
internal class ProjectJob(project: Project) {
internal val sharedJob: Job = Job()
init {
Disposer.register(project, Disposable {
sharedJob.cancel()
})
}
}
+3
View File
@@ -367,6 +367,9 @@
<projectService serviceInterface="org.jetbrains.kotlin.idea.caches.resolve.ScriptBinariesScopeCache"
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.ScriptBinariesScopeCache"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.core.util.ProjectJob"
serviceImplementation="org.jetbrains.kotlin.idea.core.util.ProjectJob"/>
<errorHandler implementation="org.jetbrains.kotlin.idea.reporter.KotlinReportSubmitter"/>
<internalFileTemplate name="Kotlin File"/>