Add JDK roots to the beginning of the roots list

This behavior was used until 6a1b6d10d8, 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
This commit is contained in:
Alexander Udalov
2017-11-28 16:31:47 +01:00
parent d976eeabf7
commit d4b5032810
8 changed files with 33 additions and 3 deletions
@@ -588,11 +588,13 @@ class KotlinCoreEnvironment private constructor(
} }
if (!CoreJrtFileSystem.isModularJdk(javaRoot)) { if (!CoreJrtFileSystem.isModularJdk(javaRoot)) {
addJvmClasspathRoots(classesRoots)
if (classesRoots.isEmpty()) { if (classesRoots.isEmpty()) {
val messageCollector = get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) val messageCollector = get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
messageCollector?.report(ERROR, "No class roots are found in the JDK path: $javaRoot") messageCollector?.report(ERROR, "No class roots are found in the JDK path: $javaRoot")
} }
else {
addJvmSdkRoots(classesRoots)
}
} }
} }
@@ -40,6 +40,10 @@ fun CompilerConfiguration.addJvmClasspathRoots(files: List<File>) {
files.forEach(this::addJvmClasspathRoot) files.forEach(this::addJvmClasspathRoot)
} }
fun CompilerConfiguration.addJvmSdkRoots(files: List<File>) {
addAll(JVMConfigurationKeys.CONTENT_ROOTS, 0, files.map(::JvmClasspathRoot))
}
val CompilerConfiguration.jvmClasspathRoots: List<File> val CompilerConfiguration.jvmClasspathRoots: List<File>
get() = getList(JVMConfigurationKeys.CONTENT_ROOTS).filterIsInstance<JvmClasspathRoot>().map(JvmContentRoot::file) get() = getList(JVMConfigurationKeys.CONTENT_ROOTS).filterIsInstance<JvmClasspathRoot>().map(JvmContentRoot::file)
@@ -90,12 +90,16 @@ public class CompilerConfiguration {
} }
public <T> void addAll(@NotNull CompilerConfigurationKey<List<T>> key, @NotNull Collection<T> values) { public <T> void addAll(@NotNull CompilerConfigurationKey<List<T>> key, @NotNull Collection<T> values) {
addAll(key, getList(key).size(), values);
}
public <T> void addAll(@NotNull CompilerConfigurationKey<List<T>> key, int index, @NotNull Collection<T> values) {
checkReadOnly(); checkReadOnly();
checkForNullElements(values); checkForNullElements(values);
Key<List<T>> ideaKey = key.ideaKey; Key<List<T>> ideaKey = key.ideaKey;
map.computeIfAbsent(ideaKey, k -> new ArrayList<T>()); map.computeIfAbsent(ideaKey, k -> new ArrayList<T>());
List<T> list = (List<T>) map.get(ideaKey); List<T> list = (List<T>) map.get(ideaKey);
list.addAll(values); list.addAll(index, values);
} }
public CompilerConfiguration copy() { public CompilerConfiguration copy() {
@@ -0,0 +1,5 @@
package java.util;
public class Date {
public static void methodWhichDoesNotExistInJdk() {}
}
@@ -0,0 +1,4 @@
compiler/testData/compileKotlinAgainstCustomBinaries/classFromJdkInLibrary/source.kt:4:10: error: unresolved reference: methodWhichDoesNotExistInJdk
Date.methodWhichDoesNotExistInJdk()
^
COMPILATION_ERROR
@@ -0,0 +1,5 @@
import java.util.Date
fun foo() {
Date.methodWhichDoesNotExistInJdk()
}
@@ -434,6 +434,11 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
assertEquals(result[0], result[1]) assertEquals(result[0], result[1])
} }
fun testClassFromJdkInLibrary() {
val library = compileLibrary("library")
compileKotlin("source.kt", tmpdir, listOf(library))
}
companion object { companion object {
// compiler before 1.1.4 version did not include suspension marks into bytecode. // compiler before 1.1.4 version did not include suspension marks into bytecode.
private fun stripSuspensionMarksToImitateLegacyCompiler(bytes: ByteArray): Pair<ByteArray, Int> { private fun stripSuspensionMarksToImitateLegacyCompiler(bytes: ByteArray): Pair<ByteArray, Int> {
@@ -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.messages.PrintingMessageCollector
import org.jetbrains.kotlin.cli.common.repl.* import org.jetbrains.kotlin.cli.common.repl.*
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots 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.cli.jvm.repl.GenericReplCompiler
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.KotlinScriptDefinition
@@ -67,7 +68,7 @@ class KotlinJsr223JvmLocalScriptEngine(
} }
private fun makeCompilerConfiguration() = CompilerConfiguration().apply { private fun makeCompilerConfiguration() = CompilerConfiguration().apply {
addJvmClasspathRoots(PathUtil.getJdkClassesRootsFromCurrentJre()) addJvmSdkRoots(PathUtil.getJdkClassesRootsFromCurrentJre())
addJvmClasspathRoots(templateClasspath) addJvmClasspathRoots(templateClasspath)
put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script") put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script")
languageVersionSettings = LanguageVersionSettingsImpl( languageVersionSettings = LanguageVersionSettingsImpl(