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.annotations.TestOnly
import org.jetbrains.kotlin.idea.caches.project.getAllProjectSdks 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.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.listener.ScriptConfigurationUpdater
import org.jetbrains.kotlin.idea.core.script.configuration.loader.LoadedScriptConfiguration
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult
@@ -103,7 +102,7 @@ interface ScriptConfigurationManager {
* Start indexing for new class/source roots. * Start indexing for new class/source roots.
* Re-highlight opened scripts with changed configuration. * Re-highlight opened scripts with changed configuration.
*/ */
fun saveCompilationConfigurationAfterImport(files: List<Pair<VirtualFile, LoadedScriptConfiguration>>) fun saveCompilationConfigurationAfterImport(files: List<Pair<VirtualFile, ScriptConfigurationSnapshot>>)
/////////////// ///////////////
// classpath roots info: // classpath roots info:
@@ -20,8 +20,9 @@ import kotlinx.coroutines.launch
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.idea.core.script.* import org.jetbrains.kotlin.idea.core.script.*
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager.Companion.toVfsRoots 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.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.listener.ScriptConfigurationUpdater
import org.jetbrains.kotlin.idea.core.script.configuration.utils.ScriptClassRootsCache import org.jetbrains.kotlin.idea.core.script.configuration.utils.ScriptClassRootsCache
import org.jetbrains.kotlin.idea.core.script.configuration.utils.ScriptClassRootsIndexer 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> = override fun getScriptClasspath(file: KtFile): List<VirtualFile> =
toVfsRoots(getConfiguration(file)?.dependenciesClassPath.orEmpty()) toVfsRoots(getConfiguration(file)?.dependenciesClassPath.orEmpty())
fun getCachedConfiguration(file: VirtualFile?): CachedConfigurationSnapshot? { fun getCachedConfiguration(file: VirtualFile?): ScriptConfigurationSnapshot? {
if (file == null) return null if (file == null) return null
return cache[file] return cache[file]
} }
@@ -173,7 +174,7 @@ internal abstract class AbstractScriptConfigurationManager(
protected open fun saveChangedConfiguration( protected open fun saveChangedConfiguration(
file: VirtualFile, file: VirtualFile,
newConfigurationSnapshot: CachedConfigurationSnapshot? newConfigurationSnapshot: ScriptConfigurationSnapshot?
) { ) {
rootsIndexer.checkInTransaction() rootsIndexer.checkInTransaction()
val newConfiguration = newConfigurationSnapshot?.configuration val newConfiguration = newConfigurationSnapshot?.configuration
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import kotlin.script.experimental.api.ScriptDiagnostic
interface CachedConfigurationInputs { interface CachedConfigurationInputs {
fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile? = null): Boolean 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 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 { interface ScriptConfigurationCache {
operator fun get(file: VirtualFile): CachedConfigurationSnapshot? operator fun get(file: VirtualFile): ScriptConfigurationSnapshot?
operator fun set(file: VirtualFile, configurationSnapshot: CachedConfigurationSnapshot) operator fun set(file: VirtualFile, configurationSnapshot: ScriptConfigurationSnapshot)
fun markOutOfDate(file: VirtualFile) fun markOutOfDate(file: VirtualFile)
fun all(): Collection<Pair<VirtualFile, ScriptCompilationConfigurationWrapper>> 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.project.Project
import com.intellij.openapi.vfs.VirtualFile 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.ScriptConfigurationLoader
import org.jetbrains.kotlin.idea.core.script.configuration.loader.ScriptConfigurationLoadingContext import org.jetbrains.kotlin.idea.core.script.configuration.loader.ScriptConfigurationLoadingContext
import org.jetbrains.kotlin.idea.core.script.configuration.utils.getKtFile import org.jetbrains.kotlin.idea.core.script.configuration.utils.getKtFile
@@ -38,8 +37,12 @@ internal class ScriptConfigurationFileAttributeCache(
if (!isFirstLoad) return false if (!isFirstLoad) return false
val fromFs = load(virtualFile) ?: return false val fromFs = load(virtualFile) ?: return false
// todo(KT-34444): save inputs to fs val result =
val result = LoadedScriptConfiguration(CachedConfigurationInputs.OutOfDate, listOf(), fromFs) ScriptConfigurationSnapshot(
CachedConfigurationInputs.OutOfDate, // todo(KT-34444): save inputs to fs
listOf(), // todo(KT-34444): save reports to fs
fromFs
)
context.saveNewConfiguration(virtualFile, result) context.saveNewConfiguration(virtualFile, result)
return true 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.project.Project
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.containers.SLRUMap 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 org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import java.io.DataInput
import java.io.DataOutput
abstract class ScriptConfigurationMemoryCache( class ScriptConfigurationMemoryCache(
val project: Project val project: Project
) : ScriptConfigurationCache { ) : ScriptConfigurationCache {
companion object { companion object {
const val MAX_SCRIPTS_CACHED = 50 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 @Synchronized
override operator fun get(file: VirtualFile): CachedConfigurationSnapshot? { override operator fun get(file: VirtualFile): ScriptConfigurationSnapshot? {
return memoryCache.get(file) return memoryCache.get(file)
} }
@Synchronized @Synchronized
override operator fun set(file: VirtualFile, configurationSnapshot: CachedConfigurationSnapshot) { override operator fun set(file: VirtualFile, configurationSnapshot: ScriptConfigurationSnapshot) {
memoryCache.put( memoryCache.put(
file, file,
configurationSnapshot configurationSnapshot
) )
} }
@Synchronized override fun markUpToDate(file: VirtualFile, inputs: CachedConfigurationInputs) {
override fun markOutOfDate(file: VirtualFile) {
val old = memoryCache[file] val old = memoryCache[file]
if (old != null) { if (old != null) {
memoryCache.put(file, old.copy(inputs = CachedConfigurationInputs.OutOfDate)) memoryCache.put(file, old.copy(inputs = inputs))
} }
} }
@Synchronized @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.project.Project
import com.intellij.openapi.vfs.VirtualFile 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.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.configuration.utils.getKtFile
import org.jetbrains.kotlin.idea.core.script.debug import org.jetbrains.kotlin.idea.core.script.debug
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -42,7 +43,7 @@ open class DefaultScriptConfigurationLoader(val project: Project) : ScriptConfig
KtFileScriptSource(file), scriptDefinition, file.project KtFileScriptSource(file), scriptDefinition, file.project
) )
val result = LoadedScriptConfiguration( val result = ScriptConfigurationSnapshot(
inputs, inputs,
scriptingApiResult.reports, scriptingApiResult.reports,
scriptingApiResult.valueOrNull() 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 package org.jetbrains.kotlin.idea.core.script.configuration.loader
import com.intellij.openapi.vfs.VirtualFile 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.ScriptConfigurationFileAttributeCache
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
interface ScriptConfigurationLoadingContext { interface ScriptConfigurationLoadingContext {
fun getCachedConfiguration(file: VirtualFile): CachedConfigurationSnapshot? fun getCachedConfiguration(file: VirtualFile): ScriptConfigurationSnapshot?
/** /**
* Show notification about new configuration with suggestion to apply it. * Show notification about new configuration with suggestion to apply it.
@@ -23,7 +23,7 @@ interface ScriptConfigurationLoadingContext {
*/ */
fun suggestNewConfiguration( fun suggestNewConfiguration(
file: VirtualFile, file: VirtualFile,
newResult: LoadedScriptConfiguration newResult: ScriptConfigurationSnapshot
) )
/** /**
@@ -33,6 +33,6 @@ interface ScriptConfigurationLoadingContext {
*/ */
fun saveNewConfiguration( fun saveNewConfiguration(
file: VirtualFile, 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.project.Project
import com.intellij.openapi.vfs.VirtualFile 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.idea.highlighter.OutsidersPsiFileSupportUtils
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import kotlin.script.experimental.api.asSuccess
internal class ScriptOutsiderFileConfigurationLoader(val project: Project) : internal class ScriptOutsiderFileConfigurationLoader(val project: Project) :
ScriptConfigurationLoader { ScriptConfigurationLoader {
@@ -28,7 +28,14 @@ internal class ScriptOutsiderFileConfigurationLoader(val project: Project) :
val original = context.getCachedConfiguration(fileOrigin) val original = context.getCachedConfiguration(fileOrigin)
if (original != null) { 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? // 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 com.intellij.pom.Navigatable
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager 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.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.getGradleScriptInputsStamp
import org.jetbrains.kotlin.idea.core.script.configuration.loader.LoadedScriptConfiguration
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource
@@ -58,7 +58,7 @@ class KotlinGradleBuildScriptsDataService : AbstractProjectDataService<GradleSou
) )
val javaHome = File(gradleExeSettings.javaHome ?: return) val javaHome = File(gradleExeSettings.javaHome ?: return)
val files = mutableListOf<Pair<VirtualFile, LoadedScriptConfiguration>>() val files = mutableListOf<Pair<VirtualFile, ScriptConfigurationSnapshot>>()
projectDataNode.gradleKotlinBuildScripts?.forEach { buildScript -> projectDataNode.gradleKotlinBuildScripts?.forEach { buildScript ->
val scriptFile = File(buildScript.file) val scriptFile = File(buildScript.file)
@@ -70,7 +70,7 @@ class KotlinGradleBuildScriptsDataService : AbstractProjectDataService<GradleSou
files.add( files.add(
Pair( Pair(
virtualFile, virtualFile,
LoadedScriptConfiguration( ScriptConfigurationSnapshot(
inputs ?: CachedConfigurationInputs.OutOfDate, inputs ?: CachedConfigurationInputs.OutOfDate,
listOf(), listOf(),
ScriptCompilationConfigurationWrapper.FromLegacy( ScriptCompilationConfigurationWrapper.FromLegacy(