IDE script support: cancel coroutines on project disposal

This commit is contained in:
Pavel V. Talanov
2017-07-28 19:35:45 +03:00
parent 7f361c7579
commit 653314e671
2 changed files with 7 additions and 3 deletions
@@ -72,7 +72,7 @@ internal class ScriptDependenciesCache(private val project: Project) {
private fun updateHighlighting(file: VirtualFile?) { private fun updateHighlighting(file: VirtualFile?) {
ScriptDependenciesModificationTracker.getInstance(project).incModificationCount() ScriptDependenciesModificationTracker.getInstance(project).incModificationCount()
launch(EDT) { launch(EDT(project)) {
if (file != null) { if (file != null) {
file.let { PsiManager.getInstance(project).findFile(it) }?.let { psiFile -> file.let { PsiManager.getInstance(project).findFile(it) }?.let { psiFile ->
DaemonCodeAnalyzer.getInstance(project).restart(psiFile) DaemonCodeAnalyzer.getInstance(project).restart(psiFile)
@@ -35,6 +35,8 @@ import kotlinx.coroutines.experimental.Job
import kotlinx.coroutines.experimental.asCoroutineDispatcher import kotlinx.coroutines.experimental.asCoroutineDispatcher
import kotlinx.coroutines.experimental.launch import kotlinx.coroutines.experimental.launch
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.idea.core.util.EDT
import org.jetbrains.kotlin.idea.core.util.cancelOnDisposal
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.psi.NotNullableUserDataProperty import org.jetbrains.kotlin.psi.NotNullableUserDataProperty
import org.jetbrains.kotlin.script.* import org.jetbrains.kotlin.script.*
@@ -166,7 +168,7 @@ internal class ScriptDependenciesUpdater(
currentTimeStamp: TimeStamp, currentTimeStamp: TimeStamp,
scriptDef: KotlinScriptDefinition, scriptDef: KotlinScriptDefinition,
doResolve: suspend () -> DependenciesResolver.ResolveResult doResolve: suspend () -> DependenciesResolver.ResolveResult
) = launch(dispatcher) { ) = launch(dispatcher + project.cancelOnDisposal) {
val result = try { val result = try {
doResolve() doResolve()
} }
@@ -231,7 +233,9 @@ internal class ScriptDependenciesUpdater(
rootsChangesRunnable.invoke() rootsChangesRunnable.invoke()
} }
else { else {
application.invokeLater(rootsChangesRunnable, ModalityState.defaultModalityState()) launch(EDT(project)) {
rootsChangesRunnable()
}
} }
} }