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(