Refactoring: add isApplicable method to ScriptDependenciesLoader
This commit is contained in:
+1
-2
@@ -76,9 +76,8 @@ class ScriptDependenciesManager internal constructor(
|
||||
|
||||
@TestOnly
|
||||
fun updateScriptDependenciesSynchronously(virtualFile: VirtualFile, project: Project) {
|
||||
val scriptDefinition = virtualFile.findScriptDefinition(project)!!
|
||||
val loader = SyncScriptDependenciesLoader(project)
|
||||
loader.updateDependencies(virtualFile, scriptDefinition)
|
||||
loader.updateDependencies(virtualFile)
|
||||
loader.notifyRootsChanged()
|
||||
}
|
||||
}
|
||||
|
||||
+15
-27
@@ -41,7 +41,6 @@ import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.NotNullableUserDataProperty
|
||||
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
|
||||
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
|
||||
import org.jetbrains.kotlin.scripting.definitions.scriptDefinition
|
||||
import org.jetbrains.kotlin.scripting.resolve.LegacyResolverWrapper
|
||||
import kotlin.script.experimental.dependencies.AsyncDependenciesResolver
|
||||
import kotlin.script.experimental.dependencies.ScriptDependencies
|
||||
@@ -53,9 +52,11 @@ class ScriptDependenciesUpdater(
|
||||
private val scriptsQueue = Alarm(Alarm.ThreadToUse.SWING_THREAD, project)
|
||||
private val scriptChangesListenerDelay = 1400
|
||||
|
||||
private val asyncLoader = AsyncScriptDependenciesLoader(project)
|
||||
private val syncLoader = SyncScriptDependenciesLoader(project)
|
||||
private val fileAttributeLoader = FromFileAttributeScriptDependenciesLoader(project)
|
||||
private val loaders = arrayListOf(
|
||||
FromFileAttributeScriptDependenciesLoader(project),
|
||||
AsyncScriptDependenciesLoader(project),
|
||||
SyncScriptDependenciesLoader(project)
|
||||
)
|
||||
|
||||
init {
|
||||
listenForChangesInScripts()
|
||||
@@ -64,12 +65,7 @@ class ScriptDependenciesUpdater(
|
||||
fun getCurrentDependencies(file: VirtualFile): ScriptDependencies {
|
||||
cache[file]?.let { return it }
|
||||
|
||||
val scriptDef = file.findScriptDefinition(project) ?: return ScriptDependencies.Empty
|
||||
|
||||
fileAttributeLoader.updateDependencies(file, scriptDef)
|
||||
|
||||
updateDependencies(file, scriptDef)
|
||||
|
||||
updateDependencies(file)
|
||||
makeRootsChangeIfNeeded()
|
||||
|
||||
return cache[file] ?: ScriptDependencies.Empty
|
||||
@@ -82,8 +78,7 @@ class ScriptDependenciesUpdater(
|
||||
for (file in files) {
|
||||
if (!areDependenciesCached(file)) {
|
||||
wasDependenciesUpdateStarted = true
|
||||
val scriptDef = file.findScriptDefinition(project) ?: continue
|
||||
updateDependencies(file, scriptDef)
|
||||
updateDependencies(file)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,18 +89,14 @@ class ScriptDependenciesUpdater(
|
||||
return wasDependenciesUpdateStarted
|
||||
}
|
||||
|
||||
private fun updateDependencies(file: VirtualFile, scriptDef: KotlinScriptDefinition) {
|
||||
val loader = when {
|
||||
isAsyncDependencyResolver(scriptDef) -> asyncLoader
|
||||
else -> syncLoader
|
||||
}
|
||||
loader.updateDependencies(file, scriptDef)
|
||||
private fun updateDependencies(file: VirtualFile) {
|
||||
loaders.filter { it.isApplicable(file) }.forEach { it.updateDependencies(file) }
|
||||
}
|
||||
|
||||
private fun makeRootsChangeIfNeeded() {
|
||||
if (fileAttributeLoader.notifyRootsChanged()) return
|
||||
if (syncLoader.notifyRootsChanged()) return
|
||||
if (asyncLoader.notifyRootsChanged()) return
|
||||
loaders.firstOrNull {
|
||||
it.notifyRootsChanged()
|
||||
}
|
||||
}
|
||||
|
||||
private fun listenForChangesInScripts() {
|
||||
@@ -124,11 +115,9 @@ class ScriptDependenciesUpdater(
|
||||
|
||||
if (ApplicationManager.getApplication().isUnitTestMode && ApplicationManager.getApplication().isScriptDependenciesUpdaterDisabled == true) return
|
||||
|
||||
val scriptDef = ktFile.scriptDefinition() ?: return
|
||||
|
||||
if (!ProjectRootsUtil.isInProjectSource(ktFile, includeScriptsOutsideSourceRoots = true)) return
|
||||
|
||||
updateDependencies(file, scriptDef)
|
||||
updateDependencies(file)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -151,7 +140,6 @@ class ScriptDependenciesUpdater(
|
||||
}
|
||||
|
||||
val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return
|
||||
val scriptDef = ktFile.scriptDefinition() ?: return
|
||||
|
||||
if (!ProjectRootsUtil.isInProjectSource(ktFile, includeScriptsOutsideSourceRoots = true)) return
|
||||
|
||||
@@ -160,7 +148,7 @@ class ScriptDependenciesUpdater(
|
||||
scriptsQueue.addRequest(
|
||||
{
|
||||
FileDocumentManager.getInstance().saveDocument(document)
|
||||
updateDependencies(file, scriptDef)
|
||||
updateDependencies(file)
|
||||
},
|
||||
scriptChangesListenerDelay,
|
||||
true
|
||||
@@ -173,7 +161,7 @@ class ScriptDependenciesUpdater(
|
||||
return cache[file] != null || file.scriptDependencies != null
|
||||
}
|
||||
|
||||
private fun isAsyncDependencyResolver(scriptDef: KotlinScriptDefinition): Boolean {
|
||||
fun isAsyncDependencyResolver(scriptDef: KotlinScriptDefinition): Boolean {
|
||||
val dependencyResolver = scriptDef.dependencyResolver
|
||||
return dependencyResolver is AsyncDependenciesResolver || dependencyResolver is LegacyResolverWrapper
|
||||
}
|
||||
|
||||
+7
-1
@@ -14,6 +14,7 @@ import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import kotlinx.coroutines.Runnable
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesUpdater
|
||||
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
|
||||
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
|
||||
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
|
||||
@@ -30,7 +31,12 @@ class AsyncScriptDependenciesLoader internal constructor(project: Project) : Scr
|
||||
private var notifyRootChange: Boolean = false
|
||||
private var backgroundTasksQueue: LoaderBackgroundTask? = null
|
||||
|
||||
override fun loadDependencies(file: VirtualFile, scriptDef: KotlinScriptDefinition) {
|
||||
override fun isApplicable(file: VirtualFile): Boolean {
|
||||
val scriptDefinition = file.findScriptDefinition(project) ?: return false
|
||||
return ScriptDependenciesUpdater.getInstance(project).isAsyncDependencyResolver(scriptDefinition)
|
||||
}
|
||||
|
||||
override fun loadDependencies(file: VirtualFile) {
|
||||
lock.write {
|
||||
if (backgroundTasksQueue == null) {
|
||||
backgroundTasksQueue = LoaderBackgroundTask()
|
||||
|
||||
+5
-2
@@ -8,12 +8,15 @@ package org.jetbrains.kotlin.idea.core.script.dependencies
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import org.jetbrains.kotlin.idea.core.script.scriptDependencies
|
||||
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
|
||||
import kotlin.script.experimental.dependencies.ScriptDependencies
|
||||
|
||||
class FromFileAttributeScriptDependenciesLoader(project: Project) : ScriptDependenciesLoader(project) {
|
||||
|
||||
override fun loadDependencies(file: VirtualFile, scriptDef: KotlinScriptDefinition) {
|
||||
override fun isApplicable(file: VirtualFile): Boolean {
|
||||
return file.scriptDependencies != null
|
||||
}
|
||||
|
||||
override fun loadDependencies(file: VirtualFile) {
|
||||
val deserializedDependencies = file.scriptDependencies ?: return
|
||||
saveToCache(deserializedDependencies, file)
|
||||
}
|
||||
|
||||
+5
-3
@@ -24,17 +24,19 @@ import kotlin.script.experimental.dependencies.DependenciesResolver
|
||||
|
||||
abstract class ScriptDependenciesLoader(protected val project: Project) {
|
||||
|
||||
fun updateDependencies(file: VirtualFile, scriptDef: KotlinScriptDefinition) {
|
||||
fun updateDependencies(file: VirtualFile) {
|
||||
if (fileModificationStamps[file.path] != file.modificationStamp) {
|
||||
fileModificationStamps.put(file.path, file.modificationStamp)
|
||||
|
||||
loadDependencies(file, scriptDef)
|
||||
loadDependencies(file)
|
||||
}
|
||||
}
|
||||
|
||||
private val fileModificationStamps: SLRUMap<String, Long> = SLRUMap(MAX_SCRIPTS_CACHED, MAX_SCRIPTS_CACHED)
|
||||
|
||||
protected abstract fun loadDependencies(file: VirtualFile, scriptDef: KotlinScriptDefinition)
|
||||
abstract fun isApplicable(file: VirtualFile): Boolean
|
||||
|
||||
protected abstract fun loadDependencies(file: VirtualFile)
|
||||
protected abstract fun shouldShowNotification(): Boolean
|
||||
|
||||
protected var shouldNotifyRootsChanged = false
|
||||
|
||||
+9
-2
@@ -7,10 +7,17 @@ package org.jetbrains.kotlin.idea.core.script.dependencies
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
|
||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesUpdater
|
||||
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
|
||||
|
||||
class SyncScriptDependenciesLoader internal constructor(project: Project) : ScriptDependenciesLoader(project) {
|
||||
override fun loadDependencies(file: VirtualFile, scriptDef: KotlinScriptDefinition) {
|
||||
override fun isApplicable(file: VirtualFile): Boolean {
|
||||
val scriptDefinition = file.findScriptDefinition(project) ?: return false
|
||||
return !ScriptDependenciesUpdater.getInstance(project).isAsyncDependencyResolver(scriptDefinition)
|
||||
}
|
||||
|
||||
override fun loadDependencies(file: VirtualFile) {
|
||||
val scriptDef = file.findScriptDefinition(project) ?: return
|
||||
val result = contentLoader.loadContentsAndResolveDependencies(scriptDef, file)
|
||||
processResult(result, file, scriptDef)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user