Fix classpath handling when evaluating legacy scripts from kotlinc

#KT-33554 fixed
This commit is contained in:
Ilya Chernikov
2019-08-27 15:01:06 +02:00
parent 31c56d7794
commit c9b25cad01
3 changed files with 27 additions and 2 deletions
@@ -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)
@@ -0,0 +1,4 @@
org.jetbrains.kotlin.mainKts.MainKtsConfigurator()
println("Hello from standard kts!")
@@ -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(