Reload dependencies for kts files after Gradle Sync

^KT-21721 In Progress
This commit is contained in:
Natalia Selezneva
2018-02-12 12:56:25 +03:00
parent af4c1ce0e9
commit e62412398c
2 changed files with 30 additions and 32 deletions
@@ -40,7 +40,6 @@ 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.*
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.Executors import java.util.concurrent.Executors
import kotlin.script.experimental.dependencies.AsyncDependenciesResolver import kotlin.script.experimental.dependencies.AsyncDependenciesResolver
@@ -60,6 +59,8 @@ class ScriptDependenciesUpdater(
(Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1) (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1)
).asCoroutineDispatcher() ).asCoroutineDispatcher()
private val modifiedScripts = mutableSetOf<VirtualFile>()
init { init {
listenToVfsChanges() listenToVfsChanges()
} }
@@ -78,21 +79,17 @@ class ScriptDependenciesUpdater(
fun getCurrentDependencies(file: VirtualFile): ScriptDependencies { fun getCurrentDependencies(file: VirtualFile): ScriptDependencies {
cache[file]?.let { return it } cache[file]?.let { return it }
val loaded = tryLoadingFromDisk(file) tryLoadingFromDisk(file)
if (!loaded) {
tryUsingDefault(file)
}
performUpdate(file) performUpdate(file)
return cache[file] ?: ScriptDependencies.Empty return cache[file] ?: ScriptDependencies.Empty
} }
private fun tryUsingDefault(file: VirtualFile) { fun reloadModifiedScripts() {
val defaults = for (it in modifiedScripts) {
DefaultScriptDependenciesProvider.getInstances(project).firstNotNullResult { it.defaultDependenciesFor(file) } ?: return performUpdate(it)
saveToCache(defaults, file) }
modifiedScripts.clear()
} }
private fun tryLoadingFromDisk(file: VirtualFile): Boolean { private fun tryLoadingFromDisk(file: VirtualFile): Boolean {
@@ -109,24 +106,21 @@ class ScriptDependenciesUpdater(
} }
} }
private fun requestUpdate(files: Iterable<VirtualFile>) = private fun requestUpdate(files: Iterable<VirtualFile>) {
files.map { file -> files.forEach { file ->
if (!file.isValid) { if (!file.isValid) {
return cache.delete(file) cache.delete(file)
} else if (cache[file] != null) { // only update dependencies for scripts that were touched recently } else if (cache[file] != null) { // only update dependencies for scripts that were touched recently
performUpdate(file) modifiedScripts.add(file)
} else {
false
} }
}.contains(true) }
}
private fun performUpdate(file: VirtualFile): Boolean { private fun performUpdate(file: VirtualFile) {
val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) ?: return false val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) ?: return
when (scriptDef.dependencyResolver) {
return when (scriptDef.dependencyResolver) {
is AsyncDependenciesResolver, is LegacyResolverWrapper -> { is AsyncDependenciesResolver, is LegacyResolverWrapper -> {
updateAsync(file, scriptDef) updateAsync(file, scriptDef)
return false
} }
else -> updateSync(file, scriptDef) else -> updateSync(file, scriptDef)
} }
@@ -262,16 +256,16 @@ class ScriptDependenciesUpdater(
return return
} }
if (requestUpdate(events.mapNotNull { val modifiedScripts = events.mapNotNull {
// The check is partly taken from the BuildManager.java // The check is partly taken from the BuildManager.java
it.file?.takeIf { it.file?.takeIf {
// the isUnitTestMode check fixes ScriptConfigurationHighlighting & Navigation tests, since they are not trigger proper update mechanims // the isUnitTestMode check fixes ScriptConfigurationHighlighting & Navigation tests, since they are not trigger proper update mechanims
// TODO: find out the reason, then consider to fix tests and remove this check // TODO: find out the reason, then consider to fix tests and remove this check
(application.isUnitTestMode || projectFileIndex.isInContent(it)) && !isProjectOrWorkspaceFile(it) (application.isUnitTestMode ||
} scriptDefinitionProvider.isScript(it.name) && projectFileIndex.isInContent(it)) && !isProjectOrWorkspaceFile(it)
})) { }
notifyRootsChanged()
} }
requestUpdate(modifiedScripts)
} }
}) })
} }
@@ -17,6 +17,8 @@
package org.jetbrains.kotlin.idea.core.script package org.jetbrains.kotlin.idea.core.script
import com.intellij.execution.configurations.CommandLineTokenizer import com.intellij.execution.configurations.CommandLineTokenizer
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.components.service
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType
@@ -197,6 +199,8 @@ class ReloadGradleTemplatesOnSync : ExternalSystemTaskNotificationListenerAdapte
val project = id.findProject() ?: return val project = id.findProject() ?: return
val gradleDefinitionsContributor = ScriptDefinitionContributor.find<GradleScriptDefinitionsContributor>(project) val gradleDefinitionsContributor = ScriptDefinitionContributor.find<GradleScriptDefinitionsContributor>(project)
gradleDefinitionsContributor?.reloadIfNeccessary() gradleDefinitionsContributor?.reloadIfNeccessary()
project.service<ScriptDependenciesUpdater>().reloadModifiedScripts()
} }
} }
} }