From 9ca7ee3b972b2208657d9c0e93b8a479ce989ffb Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 11 Apr 2023 14:27:08 +0200 Subject: [PATCH] Don't forget to configure JdkHome for CompilerConfiguration Review: https://jetbrains.team/p/kt/reviews/9562 This commit fixes IdeaJsr223Test in kotlin plugin. The test failure was caused by b50a803b6fa0fc23732de12b3b881c10dc8cc3a8 commit where we dropped `put(JVMConfigurationKeys.JDK_HOME, ...)` from `configureJdkClasspathRoots`. Ilya Chernikov says that it's incorrect to set JDK_HOME in `configureJdkClasspathRoots`. To reproduce the test failure: 1. Update `.idea/libraries/kotlinc_kotlin_dist.xml` and `.idea/libraries/kotlinc_kotlin_jps_plugin_classpath.xml` with new Kotlin (in other words: bump bundled JPS) 2. Run the test Test failure stacktrace: ``` javax.script.ScriptException: error: cannot access 'java.io.Serializable' which is a supertype of 'kotlin.Int'. Check your module classpath for missing or conflicting dependencies y.first() + 2 ^ at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.asJsr223EvalResult(KotlinJsr223JvmScriptEngineBase.kt:104) at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.compileAndEval(KotlinJsr223JvmScriptEngineBase.kt:63) at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.eval(KotlinJsr223JvmScriptEngineBase.kt:31) at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262) at org.jetbrains.kotlin.idea.repl.IdeaJsr223Test.testJsr223Engine(IdeaJsr223Test.kt:31) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at junit.framework.TestCase.runTest(TestCase.java:177) at com.intellij.testFramework.UsefulTestCase.lambda$runBare$11(UsefulTestCase.java:479) at com.intellij.testFramework.UsefulTestCase.lambda$wrapTestRunnable$13(UsefulTestCase.java:500) ``` --- .../src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt | 10 +++++++--- .../jetbrains/kotlin/daemon/KotlinRemoteReplService.kt | 8 +++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt index 00575193808..27ac7f59b1a 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt @@ -164,14 +164,18 @@ fun CompilerConfiguration.configureJdkHome(arguments: K2JVMCompilerArguments): B messageCollector.report(LOGGING, "Using JDK home directory $jdkHome") put(JVMConfigurationKeys.JDK_HOME, jdkHome) } else { - val javaHome = File(System.getProperty("java.home")) - messageCollector.report(LOGGING, "Using JDK home inferred from java.home: $javaHome") - put(JVMConfigurationKeys.JDK_HOME, javaHome) + configureJdkHomeFromSystemProperty() } return true } +fun CompilerConfiguration.configureJdkHomeFromSystemProperty() { + val javaHome = File(System.getProperty("java.home")) + messageCollector.report(LOGGING, "Using JDK home inferred from java.home: $javaHome") + put(JVMConfigurationKeys.JDK_HOME, javaHome) +} + fun CompilerConfiguration.configureJavaModulesContentRoots(arguments: K2JVMCompilerArguments) { for (modularRoot in arguments.javaModulePath.orEmpty()) { add(CLIConfigurationKeys.CONTENT_ROOTS, JvmModulePathRoot(File(modularRoot))) diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt index 5a14798e73d..dfdc3a865a1 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt @@ -24,15 +24,16 @@ import org.jetbrains.kotlin.cli.common.extensions.ReplFactoryExtension import org.jetbrains.kotlin.cli.common.messages.* import org.jetbrains.kotlin.cli.common.repl.* import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots -import org.jetbrains.kotlin.util.ServiceLoaderLite -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots +import org.jetbrains.kotlin.cli.jvm.configureJdkHomeFromSystemProperty import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar +import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.daemon.common.CompileService import org.jetbrains.kotlin.daemon.common.CompilerId import org.jetbrains.kotlin.daemon.common.RemoteOperationsTracer +import org.jetbrains.kotlin.util.ServiceLoaderLite import org.jetbrains.kotlin.utils.PathUtil import java.io.File import java.io.PrintStream @@ -58,6 +59,7 @@ abstract class KotlinJvmReplServiceBase( put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) addJvmClasspathRoots(PathUtil.kotlinPathsForCompiler.let { listOf(it.stdlibPath, it.reflectPath, it.scriptRuntimePath) }) addJvmClasspathRoots(templateClasspath) + configureJdkHomeFromSystemProperty() // needed for IdeaJsr223Test in Kotlin plugin configureJdkClasspathRoots() put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script") languageVersionSettings = LanguageVersionSettingsImpl(