From c9b25cad01ae3476b544e5b61c7d191024db9f43 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 27 Aug 2019 15:01:06 +0200 Subject: [PATCH] Fix classpath handling when evaluating legacy scripts from kotlinc #KT-33554 fixed --- .../plugin/impl/ScriptJvmCompilerImpls.kt | 20 +++++++++++++++++-- .../withDependencyOnCompileClassPath.kts | 4 ++++ .../plugin/ScriptingWithCliCompilerTest.kt | 5 +++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 plugins/scripting/scripting-compiler/testData/integration/withDependencyOnCompileClassPath.kts 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 32ee8e746e1..fe93747f60e 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 @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM +import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots import org.jetbrains.kotlin.codegen.ClassBuilderFactories import org.jetbrains.kotlin.codegen.CompilationErrorHandler import org.jetbrains.kotlin.codegen.KotlinCodegenFacade @@ -22,6 +23,7 @@ import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.ScriptsCompil import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider import kotlin.script.experimental.api.* import kotlin.script.experimental.host.ScriptingHostConfiguration +import kotlin.script.experimental.jvm.JvmDependency import kotlin.script.experimental.jvm.compilationCache import kotlin.script.experimental.jvm.impl.KJvmCompiledScript import kotlin.script.experimental.jvm.jvm @@ -96,8 +98,22 @@ private fun compileImpl( val dependenciesProvider = ScriptDependenciesProvider.getInstance(context.environment.project) val getScriptConfiguration = { ktFile: KtFile -> - dependenciesProvider?.getScriptConfigurationResult(ktFile)?.valueOrNull()?.configuration - ?: context.baseScriptCompilationConfiguration + (dependenciesProvider?.getScriptConfigurationResult(ktFile)?.valueOrNull()?.configuration ?: context.baseScriptCompilationConfiguration) + .with { + // Adjust definitions so all compiler dependencies are saved in the resulting compilation configuration, so evaluation + // performed with the expected classpath + // TODO: make this logic obsolete by injecting classpath earlier in the pipeline + val depsFromConfiguration = get(dependencies)?.flatMapTo(HashSet()) { (it as? JvmDependency)?.classpath ?: emptyList() } + val depsFromCompiler = context.environment.configuration.jvmClasspathRoots + if (!depsFromConfiguration.isNullOrEmpty()) { + val missingDeps = depsFromCompiler.filter { !depsFromConfiguration.contains(it) } + if (missingDeps.isNotEmpty()) { + dependencies.append(JvmDependency(missingDeps)) + } + } else { + dependencies.append(JvmDependency(depsFromCompiler)) + } + } } val refinedConfiguration = getScriptConfiguration(mainKtFile) diff --git a/plugins/scripting/scripting-compiler/testData/integration/withDependencyOnCompileClassPath.kts b/plugins/scripting/scripting-compiler/testData/integration/withDependencyOnCompileClassPath.kts new file mode 100644 index 00000000000..bd73a663d6a --- /dev/null +++ b/plugins/scripting/scripting-compiler/testData/integration/withDependencyOnCompileClassPath.kts @@ -0,0 +1,4 @@ + +org.jetbrains.kotlin.mainKts.MainKtsConfigurator() + +println("Hello from standard kts!") diff --git a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingWithCliCompilerTest.kt b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingWithCliCompilerTest.kt index d824b673931..26a0be74e77 100644 --- a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingWithCliCompilerTest.kt +++ b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingWithCliCompilerTest.kt @@ -23,6 +23,11 @@ class ScriptingWithCliCompilerTest { fun testResultValue() { runWithK2JVMCompiler("$TEST_DATA_DIR/integration/intResult.kts", listOf("10")) } + + @Test + fun testStandardScriptWithDeps() { + runWithK2JVMCompiler("$TEST_DATA_DIR/integration/withDependencyOnCompileClassPath.kts", listOf("Hello from standard kts!")) + } } fun runWithK2JVMCompiler(