Refactoring: add isApplicable method to ScriptDependenciesLoader

This commit is contained in:
Natalia Selezneva
2019-05-08 13:24:55 +03:00
parent e990c61b55
commit 9e51f82248
6 changed files with 42 additions and 37 deletions
@@ -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()
}
}
@@ -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
}
@@ -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()
@@ -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)
}
@@ -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
@@ -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)
}