From 7fa459044f4a5441a4037464bdcd619112da328b Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 28 Jun 2022 14:31:14 +0300 Subject: [PATCH] [Test] Fix extracting path to standard libraries from incorrect places for external users --- .../org/jetbrains/kotlin/cli/common/utils.kt | 6 ++--- .../jetbrains/kotlin/cli/jvm/jvmArguments.kt | 24 +++++++++++++++---- .../KotlinStandardLibrariesPathProvider.kt | 16 +++++++++++++ .../JvmEnvironmentConfigurator.kt | 9 ++++--- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/utils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/utils.kt index 2368e597496..ba596c58711 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/utils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/utils.kt @@ -63,9 +63,9 @@ fun checkKotlinPackageUsage(configuration: CompilerConfiguration, files: Collect fun checkKotlinPackageUsage(configuration: CompilerConfiguration, files: Collection): Boolean = checkKotlinPackageUsage(configuration, files, configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)) -fun getLibraryFromHome( - paths: KotlinPaths?, - getLibrary: (KotlinPaths) -> File, +fun getLibraryFromHome( + paths: PathProvider?, + getLibrary: (PathProvider) -> File, libraryName: String, messageCollector: MessageCollector, noLibraryArgument: String 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 0b683bc6512..e451e5583de 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt @@ -178,10 +178,26 @@ fun CompilerConfiguration.configureContentRootsFromClassPath(arguments: K2JVMCom } fun CompilerConfiguration.configureStandardLibs(paths: KotlinPaths?, arguments: K2JVMCompilerArguments) { + configureStandardLibs( + paths, + KotlinPaths::stdlibPath, + KotlinPaths::scriptRuntimePath, + KotlinPaths::reflectPath, + arguments + ) +} + +fun CompilerConfiguration.configureStandardLibs( + paths: PathProvider?, + stdlibPath: (PathProvider) -> File, + scriptRuntimePath: (PathProvider) -> File, + reflectPath: (PathProvider) -> File, + arguments: K2JVMCompilerArguments +) { val jdkRelease = get(JVMConfigurationKeys.JDK_RELEASE) val isModularJava = isModularJava() && (jdkRelease == null || jdkRelease >= 9) - fun addRoot(moduleName: String, libraryName: String, getLibrary: (KotlinPaths) -> File, noLibraryArgument: String) { + fun addRoot(moduleName: String, libraryName: String, getLibrary: (PathProvider) -> File, noLibraryArgument: String) { addModularRootIfNotNull( isModularJava, moduleName, getLibraryFromHome(paths, getLibrary, libraryName, messageCollector, noLibraryArgument) @@ -189,13 +205,13 @@ fun CompilerConfiguration.configureStandardLibs(paths: KotlinPaths?, arguments: } if (!arguments.noStdlib) { - addRoot("kotlin.stdlib", PathUtil.KOTLIN_JAVA_STDLIB_JAR, KotlinPaths::stdlibPath, "'-no-stdlib'") - addRoot("kotlin.script.runtime", PathUtil.KOTLIN_JAVA_SCRIPT_RUNTIME_JAR, KotlinPaths::scriptRuntimePath, "'-no-stdlib'") + addRoot("kotlin.stdlib", PathUtil.KOTLIN_JAVA_STDLIB_JAR, stdlibPath, "'-no-stdlib'") + addRoot("kotlin.script.runtime", PathUtil.KOTLIN_JAVA_SCRIPT_RUNTIME_JAR, scriptRuntimePath, "'-no-stdlib'") } // "-no-stdlib" implies "-no-reflect": otherwise we would be able to transitively read stdlib classes through kotlin-reflect, // which is likely not what user wants since s/he manually provided "-no-stdlib" if (!arguments.noReflect && !arguments.noStdlib) { - addRoot("kotlin.reflect", PathUtil.KOTLIN_JAVA_REFLECT_JAR, { it.reflectPath }, "'-no-reflect' or '-no-stdlib'") + addRoot("kotlin.reflect", PathUtil.KOTLIN_JAVA_REFLECT_JAR, reflectPath, "'-no-reflect' or '-no-stdlib'") } } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/KotlinStandardLibrariesPathProvider.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/KotlinStandardLibrariesPathProvider.kt index 55e2999b688..9098360e649 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/KotlinStandardLibrariesPathProvider.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/KotlinStandardLibrariesPathProvider.kt @@ -5,7 +5,10 @@ package org.jetbrains.kotlin.test.services +import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments +import org.jetbrains.kotlin.cli.jvm.configureStandardLibs import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime +import org.jetbrains.kotlin.config.CompilerConfiguration import java.io.File import java.lang.ref.SoftReference import java.net.URL @@ -125,3 +128,16 @@ object EnvironmentBasedStandardLibrariesPathProvider : KotlinStandardLibrariesPa } val TestServices.standardLibrariesPathProvider: KotlinStandardLibrariesPathProvider by TestServices.testServiceAccessor() + +fun CompilerConfiguration.configureStandardLibs( + pathProvider: KotlinStandardLibrariesPathProvider, + arguments: K2JVMCompilerArguments +) { + configureStandardLibs( + pathProvider, + KotlinStandardLibrariesPathProvider::runtimeJarForTests, + KotlinStandardLibrariesPathProvider::scriptRuntimeJarForTests, + KotlinStandardLibrariesPathProvider::reflectJarForTests, + arguments + ) +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt index e6b342662d9..fe94c4fc081 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.jvm.addModularRootIfNotNull import org.jetbrains.kotlin.cli.jvm.config.* -import org.jetbrains.kotlin.cli.jvm.configureStandardLibs import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey import org.jetbrains.kotlin.config.JVMConfigurationKeys @@ -60,9 +59,7 @@ import org.jetbrains.kotlin.test.services.jvm.CompiledClassesManager import org.jetbrains.kotlin.test.services.jvm.compiledClassesManager import org.jetbrains.kotlin.test.util.KtTestUtil import org.jetbrains.kotlin.test.util.joinToArrayString -import org.jetbrains.kotlin.utils.PathUtil import java.io.File -import kotlin.io.path.ExperimentalPathApi class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) { companion object { @@ -176,7 +173,6 @@ class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfig register(USE_TYPE_TABLE, JVMConfigurationKeys.USE_TYPE_TABLE) } - @OptIn(ExperimentalPathApi::class, ExperimentalStdlibApi::class) override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule) { if (module.targetPlatform !in JvmPlatforms.allJvmPlatforms) return configureDefaultJvmTarget(configuration) @@ -209,7 +205,10 @@ class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfig val useJava11ToCompileIncludedJavaFiles = javaVersionToCompile == TestJavacVersion.JAVAC_11 if (configurationKind.withRuntime) { - configuration.configureStandardLibs(PathUtil.kotlinPathsForDistDirectory, K2JVMCompilerArguments().also { it.noReflect = true }) + configuration.configureStandardLibs( + testServices.standardLibrariesPathProvider, + K2JVMCompilerArguments().also { it.noReflect = true } + ) } configuration.addJvmClasspathRoots(getLibraryFilesExceptRealRuntime(testServices, configurationKind, module.directives))