From df99c4fe28a7c2f11a9e22ce05188d67367e530b Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Mon, 2 Oct 2017 17:47:23 +0300 Subject: [PATCH] Fix compiler classpath discovery: * Fix accidental filtering out the stdlib and reflect * Fix module search in classpath: use moduleId instead of k-c-embeddable --- .../main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt | 2 +- .../org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 58ccae39078..2ce171c38eb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -65,7 +65,7 @@ abstract class AbstractKotlinCompileTool() : AbstractCo get() = compilerClasspath?.takeIf { it.isNotEmpty() } ?: compilerJarFile?.let { // a hack to remove compiler jar from the cp, will be dropped when compilerJarFile will be removed - listOf(it) + findKotlinCompilerClasspath(project).filter { it.name.startsWith("kotlin-compiler") } + listOf(it) + findKotlinCompilerClasspath(project).filter { !it.name.startsWith("kotlin-compiler") } } ?: findKotlinCompilerClasspath(project).takeIf { it.isNotEmpty() } ?: throw IllegalStateException("Could not find Kotlin Compiler classpath. Please specify $name.compilerClasspath") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt index 12bdd052f60..b9e0c99164a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/jarSearchingUtil.kt @@ -91,7 +91,7 @@ private fun findJarByClass(klass: Class<*>): File? { private fun findKotlinModuleJar(project: Project, expectedClassName: String, moduleId: String): List { val pluginVersion = pluginVersionFromAppliedPlugin(project) - val filesToCheck = sequenceOf(pluginVersion?.let(::getCompilerFromClassLoader)) + + val filesToCheck = sequenceOf(pluginVersion?.let { version -> getModuleFromClassLoader(moduleId, version) }) + Sequence { findPotentialModuleJars(project, moduleId).iterator() } //call the body only when queried val entryToFind = expectedClassName.replace(".", "/") + ".class" return filesToCheck.filterNotNull().firstOrNull { it.hasEntry(entryToFind) }?.let { listOf(it) } ?: emptyList() @@ -100,10 +100,10 @@ private fun findKotlinModuleJar(project: Project, expectedClassName: String, mod private fun pluginVersionFromAppliedPlugin(project: Project): String? = project.plugins.filterIsInstance().firstOrNull()?.kotlinPluginVersion -private fun getCompilerFromClassLoader(pluginVersion: String): File? { +private fun getModuleFromClassLoader(moduleId: String, moduleVersion: String): File? { val urlClassLoader = KotlinPlugin::class.java.classLoader as? URLClassLoader ?: return null return urlClassLoader.urLs - .firstOrNull { it.toString().endsWith("kotlin-compiler-embeddable-$pluginVersion.jar") } + .firstOrNull { it.toString().endsWith("$moduleId-$moduleVersion.jar") } ?.let { File(it.toURI()) } ?.takeIf(File::exists) }