Refactor the mechanism how script configurations are updated

Introduce file attributes cache, which is only applicable when no dependencies are cached in memory cache
Refactor ScriptDependenciesCache to memory cache that is able to get configuration from cache and checks if it is up to date
Move all public methods to ScriptDependenciesManager
Introduce ScriptClassRootsManager that checks if root change event should be called after script configuration update
This commit is contained in:
Natalia Selezneva
2019-08-22 11:59:32 +03:00
parent dc46f73ecf
commit 961e8c2c74
37 changed files with 1025 additions and 898 deletions
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import java.io.File
import kotlin.script.experimental.api.valueOrNull
data class ScriptsCompilationDependencies(
val classpath: List<File>,
@@ -42,7 +41,7 @@ fun collectScriptsCompilationDependencies(
while (true) {
val newRemainingSources = ArrayList<KtFile>()
for (source in remainingSources) {
val refinedConfiguration = importsProvider.getScriptConfigurationResult(source)?.valueOrNull()
val refinedConfiguration = importsProvider.getScriptConfiguration(source)
if (refinedConfiguration != null) {
collectedClassPath.addAll(refinedConfiguration.dependenciesClassPath)
@@ -154,7 +154,7 @@ class KJvmReplCompilerImpl(val hostConfiguration: ScriptingHostConfiguration) :
sourceFiles.first(),
sourceDependencies
) { ktFile ->
dependenciesProvider?.getScriptConfigurationResult(ktFile)?.valueOrNull()?.configuration
dependenciesProvider?.getScriptConfiguration(ktFile)?.configuration
?: context.baseScriptCompilationConfiguration
}
@@ -98,7 +98,7 @@ private fun compileImpl(
val dependenciesProvider = ScriptDependenciesProvider.getInstance(context.environment.project)
val getScriptConfiguration = { ktFile: KtFile ->
(dependenciesProvider?.getScriptConfigurationResult(ktFile)?.valueOrNull()?.configuration ?: context.baseScriptCompilationConfiguration)
(dependenciesProvider?.getScriptConfiguration(ktFile)?.configuration ?: context.baseScriptCompilationConfiguration)
.with {
// Adjust definitions so all compiler dependencies are saved in the resulting compilation configuration, so evaluation
// performed with the expected classpath
@@ -33,7 +33,6 @@ import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.compilerOptions
import kotlin.script.experimental.api.dependencies
import kotlin.script.experimental.api.valueOrNull
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.JvmDependency
import kotlin.script.experimental.jvm.jdkHome
@@ -244,7 +243,7 @@ private fun CompilerConfiguration.updateWithRefinedConfigurations(
) {
val dependenciesProvider = ScriptDependenciesProvider.getInstance(context.environment.project)
val updatedCompilerOptions = sourceFiles.flatMap {
dependenciesProvider?.getScriptConfigurationResult(it)?.valueOrNull()?.configuration?.get(
dependenciesProvider?.getScriptConfiguration(it)?.configuration?.get(
ScriptCompilationConfiguration.compilerOptions
) ?: emptyList()
}
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import java.io.File
import java.util.concurrent.locks.ReentrantReadWriteLock
import kotlin.concurrent.write
import kotlin.script.experimental.api.valueOrNull
// WARNING: not thread safe, assuming external synchronization
@@ -71,7 +70,7 @@ open class GenericReplCompiler(
}
val newDependencies =
ScriptDependenciesProvider.getInstance(checker.environment.project)?.getScriptConfigurationResult(psiFile)?.valueOrNull()
ScriptDependenciesProvider.getInstance(checker.environment.project)?.getScriptConfiguration(psiFile)
?.legacyDependencies
var classpathAddendum: List<File>? = null
if (compilerState.lastDependencies != newDependencies) {