LoadedScriptConfiguration and CachedConfigurationSnapshot are merged to ScriptConfigurationSnapshot

This commit is contained in:
Sergey Rostov
2019-10-29 15:56:36 +03:00
committed by Natalia Selezneva
parent a89ce4c590
commit 0422abdb7b
10 changed files with 55 additions and 51 deletions
@@ -29,9 +29,8 @@ import com.intellij.util.io.URLUtil
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.idea.caches.project.getAllProjectSdks
import org.jetbrains.kotlin.idea.core.script.configuration.AbstractScriptConfigurationManager
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationSnapshot
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
import org.jetbrains.kotlin.idea.core.script.configuration.listener.ScriptConfigurationUpdater
import org.jetbrains.kotlin.idea.core.script.configuration.loader.LoadedScriptConfiguration
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult
@@ -103,7 +102,7 @@ interface ScriptConfigurationManager {
* Start indexing for new class/source roots.
* Re-highlight opened scripts with changed configuration.
*/
fun saveCompilationConfigurationAfterImport(files: List<Pair<VirtualFile, LoadedScriptConfiguration>>)
fun saveCompilationConfigurationAfterImport(files: List<Pair<VirtualFile, ScriptConfigurationSnapshot>>)
///////////////
// classpath roots info:
@@ -20,8 +20,9 @@ import kotlinx.coroutines.launch
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.idea.core.script.*
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager.Companion.toVfsRoots
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationSnapshot
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationCache
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
import org.jetbrains.kotlin.idea.core.script.configuration.listener.ScriptConfigurationUpdater
import org.jetbrains.kotlin.idea.core.script.configuration.utils.ScriptClassRootsCache
import org.jetbrains.kotlin.idea.core.script.configuration.utils.ScriptClassRootsIndexer
@@ -86,7 +87,7 @@ internal abstract class AbstractScriptConfigurationManager(
override fun getScriptClasspath(file: KtFile): List<VirtualFile> =
toVfsRoots(getConfiguration(file)?.dependenciesClassPath.orEmpty())
fun getCachedConfiguration(file: VirtualFile?): CachedConfigurationSnapshot? {
fun getCachedConfiguration(file: VirtualFile?): ScriptConfigurationSnapshot? {
if (file == null) return null
return cache[file]
}
@@ -173,7 +174,7 @@ internal abstract class AbstractScriptConfigurationManager(
protected open fun saveChangedConfiguration(
file: VirtualFile,
newConfigurationSnapshot: CachedConfigurationSnapshot?
newConfigurationSnapshot: ScriptConfigurationSnapshot?
) {
rootsIndexer.checkInTransaction()
val newConfiguration = newConfigurationSnapshot?.configuration
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import kotlin.script.experimental.api.ScriptDiagnostic
interface CachedConfigurationInputs {
fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile? = null): Boolean
@@ -23,14 +24,22 @@ interface CachedConfigurationInputs {
}
}
data class CachedConfigurationSnapshot(
data class ScriptConfigurationSnapshot(
val inputs: CachedConfigurationInputs,
val configuration: ScriptCompilationConfigurationWrapper
val reports: List<ScriptDiagnostic>,
val configuration: ScriptCompilationConfigurationWrapper?
)
/**
* Cached configurations for file's specific snapshot state.
*
* Writer should put related inputs snapshot for loaded configuration.
* Reader may do up-to-date check for existed entry.
*/
interface ScriptConfigurationCache {
operator fun get(file: VirtualFile): CachedConfigurationSnapshot?
operator fun set(file: VirtualFile, configurationSnapshot: CachedConfigurationSnapshot)
operator fun get(file: VirtualFile): ScriptConfigurationSnapshot?
operator fun set(file: VirtualFile, configurationSnapshot: ScriptConfigurationSnapshot)
fun markOutOfDate(file: VirtualFile)
fun all(): Collection<Pair<VirtualFile, ScriptCompilationConfigurationWrapper>>
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.core.script.configuration.cache
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.configuration.loader.LoadedScriptConfiguration
import org.jetbrains.kotlin.idea.core.script.configuration.loader.ScriptConfigurationLoader
import org.jetbrains.kotlin.idea.core.script.configuration.loader.ScriptConfigurationLoadingContext
import org.jetbrains.kotlin.idea.core.script.configuration.utils.getKtFile
@@ -38,8 +37,12 @@ internal class ScriptConfigurationFileAttributeCache(
if (!isFirstLoad) return false
val fromFs = load(virtualFile) ?: return false
// todo(KT-34444): save inputs to fs
val result = LoadedScriptConfiguration(CachedConfigurationInputs.OutOfDate, listOf(), fromFs)
val result =
ScriptConfigurationSnapshot(
CachedConfigurationInputs.OutOfDate, // todo(KT-34444): save inputs to fs
listOf(), // todo(KT-34444): save reports to fs
fromFs
)
context.saveNewConfiguration(virtualFile, result)
return true
}
@@ -8,43 +8,43 @@ package org.jetbrains.kotlin.idea.core.script.configuration.cache
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.containers.SLRUMap
import org.jetbrains.kotlin.idea.core.script.configuration.AbstractScriptConfigurationManager
import org.jetbrains.kotlin.idea.core.script.debug
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import java.io.DataInput
import java.io.DataOutput
abstract class ScriptConfigurationMemoryCache(
class ScriptConfigurationMemoryCache(
val project: Project
) : ScriptConfigurationCache {
companion object {
const val MAX_SCRIPTS_CACHED = 50
}
private val memoryCache = SLRUMap<VirtualFile, CachedConfigurationSnapshot>(MAX_SCRIPTS_CACHED, MAX_SCRIPTS_CACHED)
private val memoryCache = SLRUMap<VirtualFile, ScriptConfigurationSnapshot>(MAX_SCRIPTS_CACHED, MAX_SCRIPTS_CACHED)
@Synchronized
override operator fun get(file: VirtualFile): CachedConfigurationSnapshot? {
override operator fun get(file: VirtualFile): ScriptConfigurationSnapshot? {
return memoryCache.get(file)
}
@Synchronized
override operator fun set(file: VirtualFile, configurationSnapshot: CachedConfigurationSnapshot) {
override operator fun set(file: VirtualFile, configurationSnapshot: ScriptConfigurationSnapshot) {
memoryCache.put(
file,
configurationSnapshot
)
}
@Synchronized
override fun markOutOfDate(file: VirtualFile) {
override fun markUpToDate(file: VirtualFile, inputs: CachedConfigurationInputs) {
val old = memoryCache[file]
if (old != null) {
memoryCache.put(file, old.copy(inputs = CachedConfigurationInputs.OutOfDate))
memoryCache.put(file, old.copy(inputs = inputs))
}
}
@Synchronized
override fun all() = memoryCache.entrySet().map { it.key to it.value.configuration }
@Suppress("UNCHECKED_CAST")
override fun all() =
memoryCache.entrySet().map {
if (it.value.configuration == null) null
else it.key to it.value.configuration
} as Collection<Pair<VirtualFile, ScriptCompilationConfigurationWrapper>>
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.core.script.configuration.loader
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
import org.jetbrains.kotlin.idea.core.script.configuration.utils.getKtFile
import org.jetbrains.kotlin.idea.core.script.debug
import org.jetbrains.kotlin.psi.KtFile
@@ -42,7 +43,7 @@ open class DefaultScriptConfigurationLoader(val project: Project) : ScriptConfig
KtFileScriptSource(file), scriptDefinition, file.project
)
val result = LoadedScriptConfiguration(
val result = ScriptConfigurationSnapshot(
inputs,
scriptingApiResult.reports,
scriptingApiResult.valueOrNull()
@@ -1,16 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.core.script.configuration.loader
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import kotlin.script.experimental.api.ScriptDiagnostic
data class LoadedScriptConfiguration(
val inputs: CachedConfigurationInputs,
val reports: List<ScriptDiagnostic>,
val configuration: ScriptCompilationConfigurationWrapper?
)
@@ -6,11 +6,11 @@
package org.jetbrains.kotlin.idea.core.script.configuration.loader
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationSnapshot
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationFileAttributeCache
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
interface ScriptConfigurationLoadingContext {
fun getCachedConfiguration(file: VirtualFile): CachedConfigurationSnapshot?
fun getCachedConfiguration(file: VirtualFile): ScriptConfigurationSnapshot?
/**
* Show notification about new configuration with suggestion to apply it.
@@ -23,7 +23,7 @@ interface ScriptConfigurationLoadingContext {
*/
fun suggestNewConfiguration(
file: VirtualFile,
newResult: LoadedScriptConfiguration
newResult: ScriptConfigurationSnapshot
)
/**
@@ -33,6 +33,6 @@ interface ScriptConfigurationLoadingContext {
*/
fun saveNewConfiguration(
file: VirtualFile,
newResult: LoadedScriptConfiguration
newResult: ScriptConfigurationSnapshot
)
}
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.idea.core.script.configuration.loader
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
import org.jetbrains.kotlin.idea.highlighter.OutsidersPsiFileSupportUtils
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import kotlin.script.experimental.api.asSuccess
internal class ScriptOutsiderFileConfigurationLoader(val project: Project) :
ScriptConfigurationLoader {
@@ -28,7 +28,14 @@ internal class ScriptOutsiderFileConfigurationLoader(val project: Project) :
val original = context.getCachedConfiguration(fileOrigin)
if (original != null) {
context.saveNewConfiguration(virtualFile, LoadedScriptConfiguration(original.inputs, listOf(), original.configuration))
context.saveNewConfiguration(
virtualFile,
ScriptConfigurationSnapshot(
original.inputs,
listOf(),
original.configuration
)
)
}
// todo(KT-34615): initiate loading configuration for original file and subscribe to it's result?
@@ -24,8 +24,8 @@ import com.intellij.openapi.vfs.VirtualFile
import com.intellij.pom.Navigatable
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
import org.jetbrains.kotlin.idea.core.script.configuration.getGradleScriptInputsStamp
import org.jetbrains.kotlin.idea.core.script.configuration.loader.LoadedScriptConfiguration
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource
@@ -58,7 +58,7 @@ class KotlinGradleBuildScriptsDataService : AbstractProjectDataService<GradleSou
)
val javaHome = File(gradleExeSettings.javaHome ?: return)
val files = mutableListOf<Pair<VirtualFile, LoadedScriptConfiguration>>()
val files = mutableListOf<Pair<VirtualFile, ScriptConfigurationSnapshot>>()
projectDataNode.gradleKotlinBuildScripts?.forEach { buildScript ->
val scriptFile = File(buildScript.file)
@@ -70,7 +70,7 @@ class KotlinGradleBuildScriptsDataService : AbstractProjectDataService<GradleSou
files.add(
Pair(
virtualFile,
LoadedScriptConfiguration(
ScriptConfigurationSnapshot(
inputs ?: CachedConfigurationInputs.OutOfDate,
listOf(),
ScriptCompilationConfigurationWrapper.FromLegacy(