From d4b503281072d2bdc041e28f9b0942fa825a7944 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 28 Nov 2017 16:31:47 +0100 Subject: [PATCH] Add JDK roots to the beginning of the roots list This behavior was used until 6a1b6d10d8dd, where the JDK has unintentionally started to be added to the end of the list, breaking code which depended on libraries which bundle something from the JDK #KT-21299 Fixed --- .../kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt | 4 +++- .../org/jetbrains/kotlin/cli/jvm/config/JvmContentRoots.kt | 4 ++++ .../org/jetbrains/kotlin/config/CompilerConfiguration.java | 6 +++++- .../classFromJdkInLibrary/library/java/util/Date.java | 5 +++++ .../classFromJdkInLibrary/output.txt | 4 ++++ .../classFromJdkInLibrary/source.kt | 5 +++++ .../jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt | 5 +++++ .../script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt | 3 ++- 8 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/library/java/util/Date.java create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/output.txt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/source.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 289205ff19f..ec539e27e60 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -588,11 +588,13 @@ class KotlinCoreEnvironment private constructor( } if (!CoreJrtFileSystem.isModularJdk(javaRoot)) { - addJvmClasspathRoots(classesRoots) if (classesRoots.isEmpty()) { val messageCollector = get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) messageCollector?.report(ERROR, "No class roots are found in the JDK path: $javaRoot") } + else { + addJvmSdkRoots(classesRoots) + } } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/config/JvmContentRoots.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/config/JvmContentRoots.kt index ef4be2a0732..fed8194945c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/config/JvmContentRoots.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/config/JvmContentRoots.kt @@ -40,6 +40,10 @@ fun CompilerConfiguration.addJvmClasspathRoots(files: List) { files.forEach(this::addJvmClasspathRoot) } +fun CompilerConfiguration.addJvmSdkRoots(files: List) { + addAll(JVMConfigurationKeys.CONTENT_ROOTS, 0, files.map(::JvmClasspathRoot)) +} + val CompilerConfiguration.jvmClasspathRoots: List get() = getList(JVMConfigurationKeys.CONTENT_ROOTS).filterIsInstance().map(JvmContentRoot::file) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/config/CompilerConfiguration.java b/compiler/frontend/src/org/jetbrains/kotlin/config/CompilerConfiguration.java index de6c7d6695b..0afc25adc07 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/config/CompilerConfiguration.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/config/CompilerConfiguration.java @@ -90,12 +90,16 @@ public class CompilerConfiguration { } public void addAll(@NotNull CompilerConfigurationKey> key, @NotNull Collection values) { + addAll(key, getList(key).size(), values); + } + + public void addAll(@NotNull CompilerConfigurationKey> key, int index, @NotNull Collection values) { checkReadOnly(); checkForNullElements(values); Key> ideaKey = key.ideaKey; map.computeIfAbsent(ideaKey, k -> new ArrayList()); List list = (List) map.get(ideaKey); - list.addAll(values); + list.addAll(index, values); } public CompilerConfiguration copy() { diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/library/java/util/Date.java b/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/library/java/util/Date.java new file mode 100644 index 00000000000..855ea32bbe5 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/library/java/util/Date.java @@ -0,0 +1,5 @@ +package java.util; + +public class Date { + public static void methodWhichDoesNotExistInJdk() {} +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/output.txt new file mode 100644 index 00000000000..3a19e16519f --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/output.txt @@ -0,0 +1,4 @@ +compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/source.kt:4:10: error: unresolved reference: methodWhichDoesNotExistInJdk + Date.methodWhichDoesNotExistInJdk() + ^ +COMPILATION_ERROR diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/source.kt new file mode 100644 index 00000000000..867e5cf7765 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/source.kt @@ -0,0 +1,5 @@ +import java.util.Date + +fun foo() { + Date.methodWhichDoesNotExistInJdk() +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt index a4a6f7447d1..54b5818e057 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt @@ -434,6 +434,11 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration assertEquals(result[0], result[1]) } + fun testClassFromJdkInLibrary() { + val library = compileLibrary("library") + compileKotlin("source.kt", tmpdir, listOf(library)) + } + companion object { // compiler before 1.1.4 version did not include suspension marks into bytecode. private fun stripSuspensionMarksToImitateLegacyCompiler(bytes: ByteArray): Pair { diff --git a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt index f39a8bec2f9..0eee371d365 100644 --- a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt +++ b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector import org.jetbrains.kotlin.cli.common.repl.* import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots +import org.jetbrains.kotlin.cli.jvm.config.addJvmSdkRoots import org.jetbrains.kotlin.cli.jvm.repl.GenericReplCompiler import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.script.KotlinScriptDefinition @@ -67,7 +68,7 @@ class KotlinJsr223JvmLocalScriptEngine( } private fun makeCompilerConfiguration() = CompilerConfiguration().apply { - addJvmClasspathRoots(PathUtil.getJdkClassesRootsFromCurrentJre()) + addJvmSdkRoots(PathUtil.getJdkClassesRootsFromCurrentJre()) addJvmClasspathRoots(templateClasspath) put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script") languageVersionSettings = LanguageVersionSettingsImpl(