diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt index f2f004b2f94..db9ee8c3e1f 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt @@ -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>) + fun saveCompilationConfigurationAfterImport(files: List>) /////////////// // classpath roots info: diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/AbstractScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/AbstractScriptConfigurationManager.kt index efcf142db78..4d189276755 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/AbstractScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/AbstractScriptConfigurationManager.kt @@ -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 = 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 diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationCache.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationCache.kt index fbd448103d8..a87954fb98b 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationCache.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationCache.kt @@ -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, + 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> diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationFileAttributeCache.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationFileAttributeCache.kt index 0beec77fea4..733fbe3ac18 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationFileAttributeCache.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationFileAttributeCache.kt @@ -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 } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationMemoryCache.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationMemoryCache.kt index adb0cac9278..8ee31b1ed74 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationMemoryCache.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationMemoryCache.kt @@ -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(MAX_SCRIPTS_CACHED, MAX_SCRIPTS_CACHED) + private val memoryCache = SLRUMap(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> } \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/DefaultScriptConfigurationLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/DefaultScriptConfigurationLoader.kt index 1d1d788bc33..57dd3dd7c1e 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/DefaultScriptConfigurationLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/DefaultScriptConfigurationLoader.kt @@ -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() diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/LoadedScriptConfiguration.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/LoadedScriptConfiguration.kt deleted file mode 100644 index 6313da467d0..00000000000 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/LoadedScriptConfiguration.kt +++ /dev/null @@ -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, - val configuration: ScriptCompilationConfigurationWrapper? -) \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptConfigurationLoadingContext.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptConfigurationLoadingContext.kt index c202f8c41ec..c1ef7dc30f9 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptConfigurationLoadingContext.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptConfigurationLoadingContext.kt @@ -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 ) } \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptOutsiderFileConfigurationLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptOutsiderFileConfigurationLoader.kt index 6750fc9fce0..4543ae729d9 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptOutsiderFileConfigurationLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/loader/ScriptOutsiderFileConfigurationLoader.kt @@ -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? diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt index e00268e5b61..c15e8479973 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt @@ -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>() + val files = mutableListOf>() projectDataNode.gradleKotlinBuildScripts?.forEach { buildScript -> val scriptFile = File(buildScript.file) @@ -70,7 +70,7 @@ class KotlinGradleBuildScriptsDataService : AbstractProjectDataService