diff --git a/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/KotlinGradleModelBuilder.kt b/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/KotlinGradleModelBuilder.kt index d9437a25f2b3..ad3b8d1e517e 100644 --- a/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/KotlinGradleModelBuilder.kt +++ b/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/KotlinGradleModelBuilder.kt @@ -239,6 +239,8 @@ class KotlinGradleModelBuilder : AbstractKotlinGradleModelBuilder(), ModelBuilde val extraProperties = HashMap() val generatedSources = mutableSetOf() + val kotlinPluginVersion = project.getKotlinPluginVersion()?.let { KotlinGradlePluginVersion.parse(it) } + val kotlinCompileTasks = target?.let { it.compilations ?: emptyList() } ?.mapNotNull { compilation -> compilation.getCompileKotlinTaskName(project) } ?: (project.getAllTasks(false)[project]?.filter { it.javaClass.name in kotlinCompileTaskClasses } ?: emptyList()) @@ -254,7 +256,7 @@ class KotlinGradleModelBuilder : AbstractKotlinGradleModelBuilder(), ModelBuilde extraProperties.acknowledgeTask(compileTask, null) } - generatedSources.addAll(project.getKotlinSourceSetGeneratedSourceRoots().map { it.absolutePathString() }) + generatedSources.addAll(project.getKotlinSourceSetGeneratedSourceRoots(kotlinPluginVersion).map { it.absolutePathString() }) val platform = platformPluginId ?: pluginToPlatform.entries.singleOrNull { project.plugins.findPlugin(it.key) != null }?.value diff --git a/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/KotlinTasksPropertyUtils.kt b/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/KotlinTasksPropertyUtils.kt index e7369b91e124..0b9682a7bfa6 100644 --- a/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/KotlinTasksPropertyUtils.kt +++ b/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/KotlinTasksPropertyUtils.kt @@ -77,14 +77,16 @@ private fun getJavaSourceRoot(project: Project, sourceSet: String): Set? { return javaSourceSet?.java?.srcDirs } -private fun Task.getKotlinPluginVersion(): String? { +internal fun Project.getKotlinPluginVersion(): String? { try { - val pluginWrapperClass = javaClass.classLoader.loadClass(kotlinPluginWrapper) + // Ensuring that the proper Gradle classpath with KGP is used by getting KGP/Kotlin extension + // otherwise we may get the parent classpath without any 3rd party plugins applied in the project + val kotlinExtension = extensions.findByName("kotlin") ?: return null + val pluginWrapperClass = kotlinExtension::class.java.classLoader.loadClass(kotlinPluginWrapper) val getVersionMethod = pluginWrapperClass.getMethod("getKotlinPluginVersion", javaClass.classLoader.loadClass("org.gradle.api.Project")) return getVersionMethod.invoke(null, this.project) as String - } catch (e: Exception) { - } + } catch (_: Exception) {} return null } @@ -98,6 +100,6 @@ fun getKotlinTaskProperties(compileTask: Task, classifier: String?): KotlinTaskP compileTask.getIsIncremental(), compileTask.getPackagePrefix(), compileTask.getPureKotlinSourceRoots(compileTask.getSourceSetName(), classifier), - compileTask.getKotlinPluginVersion() + compileTask.project.getKotlinPluginVersion() ) } diff --git a/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/generatedSourceRoots.kt b/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/generatedSourceRoots.kt index f86f31423bbd..50a7b57c9ae7 100644 --- a/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/generatedSourceRoots.kt +++ b/plugins/kotlin/gradle/gradle-tooling/impl/src/org/jetbrains/kotlin/idea/gradleTooling/generatedSourceRoots.kt @@ -7,14 +7,20 @@ import org.gradle.api.Project import org.jetbrains.kotlin.idea.gradleTooling.reflect.KotlinSourceSetReflection import java.nio.file.Path -internal fun Project.getKotlinSourceSetGeneratedSourceRoots(): List { +// KotlinSourceSet.generatedKotlin was introduced in Kotlin Gradle plugin 2.3.0 +private const val MIN_KOTLIN_PLUGIN_VERSION = "2.3.0" + +internal fun Project.getKotlinSourceSetGeneratedSourceRoots( + kotlinPluginVersion: KotlinGradlePluginVersion? +): List { + if (kotlinPluginVersion == null || kotlinPluginVersion < MIN_KOTLIN_PLUGIN_VERSION) return emptyList() + val kotlinExtension = project.extensions.findByName("kotlin") ?: return emptyList() val kotlinExtensionClass = kotlinExtension.javaClass val getSourceSets = kotlinExtensionClass.getMethodOrNull("getSourceSets") ?: return emptyList() val sourceSets = getSourceSets.invoke(kotlinExtension) as NamedDomainObjectCollection<*> - val generatedSourceRoots = sourceSets.map { it as Named }.fold(mutableListOf()) { acc, named -> - named.getKotlinSourceSetGeneratedSourceRoots()?.let { acc.addAll(it) } - acc + val generatedSourceRoots = sourceSets.map { it as Named }.flatMap { + it.getKotlinSourceSetGeneratedSourceRoots() ?: emptyList() } return generatedSourceRoots.toList() }