Add utility for EDT coroutines to be canceled on project disposal
This commit is contained in:
@@ -16,9 +16,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.core.util
|
package org.jetbrains.kotlin.idea.core.util
|
||||||
|
|
||||||
|
import com.intellij.openapi.Disposable
|
||||||
import com.intellij.openapi.application.ApplicationManager
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.openapi.application.ModalityState
|
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.CoroutineDispatcher
|
||||||
|
import kotlinx.coroutines.experimental.Job
|
||||||
import kotlin.coroutines.experimental.AbstractCoroutineContextElement
|
import kotlin.coroutines.experimental.AbstractCoroutineContextElement
|
||||||
import kotlin.coroutines.experimental.CoroutineContext
|
import kotlin.coroutines.experimental.CoroutineContext
|
||||||
|
|
||||||
@@ -36,4 +41,20 @@ public object EDT : CoroutineDispatcher() {
|
|||||||
class ModalityStateElement(val modalityState: ModalityState) : AbstractCoroutineContextElement(Key) {
|
class ModalityStateElement(val modalityState: ModalityState) : AbstractCoroutineContextElement(Key) {
|
||||||
companion object Key : CoroutineContext.Key<ModalityStateElement>
|
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()
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -367,6 +367,9 @@
|
|||||||
<projectService serviceInterface="org.jetbrains.kotlin.idea.caches.resolve.ScriptBinariesScopeCache"
|
<projectService serviceInterface="org.jetbrains.kotlin.idea.caches.resolve.ScriptBinariesScopeCache"
|
||||||
serviceImplementation="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"/>
|
<errorHandler implementation="org.jetbrains.kotlin.idea.reporter.KotlinReportSubmitter"/>
|
||||||
|
|
||||||
<internalFileTemplate name="Kotlin File"/>
|
<internalFileTemplate name="Kotlin File"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user