Fix classpath handling when evaluating legacy scripts from kotlinc
#KT-33554 fixed
This commit is contained in:
+18
-2
@@ -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.KotlinCoreEnvironment
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace
|
import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
|
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.ClassBuilderFactories
|
||||||
import org.jetbrains.kotlin.codegen.CompilationErrorHandler
|
import org.jetbrains.kotlin.codegen.CompilationErrorHandler
|
||||||
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade
|
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 org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.host.ScriptingHostConfiguration
|
import kotlin.script.experimental.host.ScriptingHostConfiguration
|
||||||
|
import kotlin.script.experimental.jvm.JvmDependency
|
||||||
import kotlin.script.experimental.jvm.compilationCache
|
import kotlin.script.experimental.jvm.compilationCache
|
||||||
import kotlin.script.experimental.jvm.impl.KJvmCompiledScript
|
import kotlin.script.experimental.jvm.impl.KJvmCompiledScript
|
||||||
import kotlin.script.experimental.jvm.jvm
|
import kotlin.script.experimental.jvm.jvm
|
||||||
@@ -96,8 +98,22 @@ private fun compileImpl(
|
|||||||
|
|
||||||
val dependenciesProvider = ScriptDependenciesProvider.getInstance(context.environment.project)
|
val dependenciesProvider = ScriptDependenciesProvider.getInstance(context.environment.project)
|
||||||
val getScriptConfiguration = { ktFile: KtFile ->
|
val getScriptConfiguration = { ktFile: KtFile ->
|
||||||
dependenciesProvider?.getScriptConfigurationResult(ktFile)?.valueOrNull()?.configuration
|
(dependenciesProvider?.getScriptConfigurationResult(ktFile)?.valueOrNull()?.configuration ?: context.baseScriptCompilationConfiguration)
|
||||||
?: 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)
|
val refinedConfiguration = getScriptConfiguration(mainKtFile)
|
||||||
|
|||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
org.jetbrains.kotlin.mainKts.MainKtsConfigurator()
|
||||||
|
|
||||||
|
println("Hello from standard kts!")
|
||||||
+5
@@ -23,6 +23,11 @@ class ScriptingWithCliCompilerTest {
|
|||||||
fun testResultValue() {
|
fun testResultValue() {
|
||||||
runWithK2JVMCompiler("$TEST_DATA_DIR/integration/intResult.kts", listOf("10"))
|
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(
|
fun runWithK2JVMCompiler(
|
||||||
|
|||||||
Reference in New Issue
Block a user