From 42629d6f8d654ff8a7ba15a35c05cd963a6674d9 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 14 Jul 2017 19:46:26 +0300 Subject: [PATCH] ScriptDependenciesUpdater: use Job explicitly instead of futures Cancel jobs without interrupting --- .../core/script/ScriptDependenciesUpdater.kt | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt index 339176ca935..e1122bc957c 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt @@ -28,11 +28,11 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.openapi.vfs.newvfs.BulkFileListener import com.intellij.openapi.vfs.newvfs.events.VFileEvent +import kotlinx.coroutines.experimental.Job import kotlinx.coroutines.experimental.asCoroutineDispatcher -import kotlinx.coroutines.experimental.future.future +import kotlinx.coroutines.experimental.launch import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.script.* -import java.util.concurrent.CompletableFuture import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.Executors import kotlin.script.dependencies.ScriptDependencies @@ -51,7 +51,7 @@ internal class ScriptDependenciesUpdater( listenToVfsChanges() } - private class TimeStampedRequest(val future: CompletableFuture<*>, val timeStamp: TimeStamp) + private class TimeStampedRequest(val job: Job, val timeStamp: TimeStamp) private class ModStampedRequest( val modificationStamp: Long, @@ -108,13 +108,13 @@ internal class ScriptDependenciesUpdater( return } - lastRequest?.request?.future?.cancel(true) + lastRequest?.request?.job?.cancel() - val (currentTimeStamp, newFuture) = sendRequest(file, scriptDefinition) + val (currentTimeStamp, newJob) = sendRequest(file, scriptDefinition) requests[path] = ModStampedRequest( file.modificationStamp, - TimeStampedRequest(newFuture, currentTimeStamp) + TimeStampedRequest(newJob, currentTimeStamp) ) return } @@ -133,17 +133,16 @@ internal class ScriptDependenciesUpdater( private fun sendRequest( file: VirtualFile, scriptDef: KotlinScriptDefinition - ): Pair> { + ): Pair { val currentTimeStamp = TimeStamps.next() val dependenciesResolver = scriptDef.dependencyResolver as AsyncDependenciesResolver val path = file.path - val newFuture = future(scriptDependencyUpdatesDispatcher) { - dependenciesResolver.resolveAsync( + val newJob = launch(scriptDependencyUpdatesDispatcher) { + val result = dependenciesResolver.resolveAsync( contentLoader.getScriptContents(scriptDef, file), (scriptDef as? KotlinScriptDefinitionFromAnnotatedTemplate)?.environment.orEmpty() ) - }.thenAccept { result -> val lastTimeStamp = requests[path]?.request?.timeStamp val isLastSentRequest = lastTimeStamp == null || lastTimeStamp == currentTimeStamp if (isLastSentRequest) { @@ -153,7 +152,7 @@ internal class ScriptDependenciesUpdater( } } } - return Pair(currentTimeStamp, newFuture) + return Pair(currentTimeStamp, newJob) } fun updateSync(file: VirtualFile, scriptDef: KotlinScriptDefinition): Boolean {