Reload dependencies for kts files after Gradle Sync
^KT-21721 In Progress
This commit is contained in:
+26
-32
@@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user