diff --git a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/CachingTest.kt b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/CachingTest.kt index 0ebd6fadf00..2b357eeb270 100644 --- a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/CachingTest.kt +++ b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/CachingTest.kt @@ -127,7 +127,7 @@ class CachingTest : TestCase() { Assert.assertEquals(1, cache.storedScripts) Assert.assertEquals(0, cache.retrievedScripts) - val cachedScript = cache.get(script.toScriptSource(), compiledScript!!.compilationConfiguration) + val cachedScript = cache.get(script.toScriptSource(), scriptCompilationConfiguration) Assert.assertNotNull(cachedScript) Assert.assertEquals(1, cache.retrievedScripts) diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt index b55098153e4..9b58d7490c8 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.scripting.compiler.plugin.impl import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport +import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM @@ -36,16 +37,17 @@ class ScriptJvmCompilerIsolated(val hostConfiguration: ScriptingHostConfiguratio scriptCompilationConfiguration: ScriptCompilationConfiguration ): ResultWithDiagnostics> = withMessageCollectorAndDisposable(script = script) { messageCollector, disposable -> + withScriptCompilationCache(script, scriptCompilationConfiguration, messageCollector) { + val initialConfiguration = scriptCompilationConfiguration.refineBeforeParsing(script).valueOr { + return@withScriptCompilationCache it + } - val initialConfiguration = scriptCompilationConfiguration.refineBeforeParsing(script).valueOr { - return it + val context = createIsolatedCompilationContext( + initialConfiguration, hostConfiguration, messageCollector, disposable + ) + + compileImpl(script, context, messageCollector) } - - val context = createIsolatedCompilationContext( - initialConfiguration, hostConfiguration, messageCollector, disposable - ) - - compileImpl(script, context, messageCollector) } } @@ -57,22 +59,41 @@ class ScriptJvmCompilerFromEnvironment(val environment: KotlinCoreEnvironment) : ): ResultWithDiagnostics> { val parentMessageCollector = environment.configuration[CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY] return withMessageCollector(script = script, parentMessageCollector = parentMessageCollector) { messageCollector -> + withScriptCompilationCache(script, scriptCompilationConfiguration, messageCollector) { - val initialConfiguration = scriptCompilationConfiguration.refineBeforeParsing(script).valueOr { - return it + val initialConfiguration = scriptCompilationConfiguration.refineBeforeParsing(script).valueOr { + return@withScriptCompilationCache it + } + + val context = createCompilationContextFromEnvironment(initialConfiguration, environment, messageCollector) + + try { + environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) + + compileImpl(script, context, messageCollector) + } finally { + if (parentMessageCollector != null) + environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, parentMessageCollector) + } } + } + } +} - val context = createCompilationContextFromEnvironment(initialConfiguration, environment, messageCollector) +private fun withScriptCompilationCache( + script: SourceCode, + scriptCompilationConfiguration: ScriptCompilationConfiguration, + messageCollector: ScriptDiagnosticsMessageCollector, + body: () -> ResultWithDiagnostics> +): ResultWithDiagnostics> { + val cache = scriptCompilationConfiguration[ScriptCompilationConfiguration.hostConfiguration]?.get(ScriptingHostConfiguration.jvm.compilationCache) - try { - environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) + val cached = cache?.get(script, scriptCompilationConfiguration) - compileImpl(script, context, messageCollector) - - } finally { - if (parentMessageCollector != null) - environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, parentMessageCollector) - } + return if (cached != null) cached.asSuccess(messageCollector.diagnostics) + else body().also { + if (cache != null && it is ResultWithDiagnostics.Success) { + cache.store(it.value, script, scriptCompilationConfiguration) } } } @@ -117,18 +138,7 @@ private fun compileImpl( } } - val refinedConfiguration = getScriptConfiguration(mainKtFile) - - val cache = refinedConfiguration[ScriptCompilationConfiguration.hostConfiguration]?.get(ScriptingHostConfiguration.jvm.compilationCache) - - val cached = cache?.get(script, refinedConfiguration) - - return cached?.asSuccess(messageCollector.diagnostics) - ?: doCompile(context, script, sourceFiles, sourceDependencies, messageCollector, getScriptConfiguration).also { - if (cache != null && it is ResultWithDiagnostics.Success) { - cache.store(it.value, script, refinedConfiguration) - } - } + return doCompile(context, script, sourceFiles, sourceDependencies, messageCollector, getScriptConfiguration) } internal fun registerPackageFragmentProvidersIfNeeded(