From 9e51f82248f158ac14d87cced07b6c52175f1595 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Wed, 8 May 2019 13:24:55 +0300 Subject: [PATCH] Refactoring: add isApplicable method to ScriptDependenciesLoader --- .../core/script/ScriptDependenciesManager.kt | 3 +- .../core/script/ScriptDependenciesUpdater.kt | 42 +++++++------------ .../AsyncScriptDependenciesLoader.kt | 8 +++- ...omFileAttributeScriptDependenciesLoader.kt | 7 +++- .../dependencies/ScriptDependenciesLoader.kt | 8 ++-- .../SyncScriptDependenciesLoader.kt | 11 ++++- 6 files changed, 42 insertions(+), 37 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt index 96c32b368cc..3d79aec6dfd 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt @@ -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() } } 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 22658b7b771..4ccdbd0f3ed 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 @@ -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 } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt index 70e5fca4d2a..94efd54ddb5 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt @@ -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() diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/FromFileAttributeScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/FromFileAttributeScriptDependenciesLoader.kt index 11e05ace03f..af3dcbfcc79 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/FromFileAttributeScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/FromFileAttributeScriptDependenciesLoader.kt @@ -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) } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/ScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/ScriptDependenciesLoader.kt index 62edafe6bca..1f673000647 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/ScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/ScriptDependenciesLoader.kt @@ -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 = 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 diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/SyncScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/SyncScriptDependenciesLoader.kt index 03212dad7e8..18ef9e7a9e5 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/SyncScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/SyncScriptDependenciesLoader.kt @@ -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) }