[Gradle] Update setupGeneralKotlinExtensionParameters to work correctly

with KGP lifecycles. It is unknown whether given source set is in main
compilation or not until certain lifecycle stage (AfterFinaliseRefinesEdges)

Therefore, configuring kotlin extension parameters that should
be delayed.

^KT-59063
This commit is contained in:
Anton Lakotka
2023-06-08 17:44:42 +02:00
committed by Space Team
parent 46844100d5
commit b097292ddf
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetHierarchy.SourceSetTree
import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport
import org.jetbrains.kotlin.gradle.plugin.ide.locateOrRegisterIdeResolveDependenciesTask import org.jetbrains.kotlin.gradle.plugin.ide.locateOrRegisterIdeResolveDependenciesTask
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.internal.runDeprecationDiagnostics
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes
import org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy.orNull import org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy.orNull
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.plugin.sources.awaitPlatformCompilations
import org.jetbrains.kotlin.gradle.plugin.sources.checkSourceSetVisibilityRequirements import org.jetbrains.kotlin.gradle.plugin.sources.checkSourceSetVisibilityRequirements
import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
@@ -181,7 +183,7 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
if (project.multiplatformExtension.internalKotlinTargetHierarchy.appliedDescriptors.isNotEmpty()) return@launchInStage if (project.multiplatformExtension.internalKotlinTargetHierarchy.appliedDescriptors.isNotEmpty()) return@launchInStage
target.compilations.forEach { compilation -> target.compilations.forEach { compilation ->
val sourceSetTree = KotlinTargetHierarchy.SourceSetTree.orNull(compilation) ?: return@forEach val sourceSetTree = SourceSetTree.orNull(compilation) ?: return@forEach
val commonSourceSet = sourceSets.findByName(lowerCamelCaseName("common", sourceSetTree.name)) ?: return@forEach val commonSourceSet = sourceSets.findByName(lowerCamelCaseName("common", sourceSetTree.name)) ?: return@forEach
compilation.defaultSourceSet.dependsOn(commonSourceSet) compilation.defaultSourceSet.dependsOn(commonSourceSet)
} }
@@ -320,30 +322,22 @@ internal fun sourcesJarTaskNamed(
} }
internal fun Project.setupGeneralKotlinExtensionParameters() { internal fun Project.setupGeneralKotlinExtensionParameters() {
val sourceSetsInMainCompilation by lazy { project.launch {
kotlinExtension.sourceSets.filter { sourceSet -> for (sourceSet in kotlinExtension.awaitSourceSets()) {
sourceSet.internal.compilations.any { val languageSettings = sourceSet.languageSettings
// kotlin main compilation if (languageSettings !is DefaultLanguageSettingsBuilder) continue
it.isMain()
// android compilation which is NOT in tested variant
|| (it as? KotlinJvmAndroidCompilation)?.let { getTestedVariantData(it.androidVariant) == null } == true
}
}
}
kotlinExtension.sourceSets.all { sourceSet -> val isMainSourceSet = sourceSet
(sourceSet.languageSettings as? DefaultLanguageSettingsBuilder)?.run { .internal
.awaitPlatformCompilations()
.any { SourceSetTree.orNull(it) == SourceSetTree.main }
explicitApi = project.providers.provider { languageSettings.explicitApi = project.providers.provider {
val explicitApiFlag = project.kotlinExtension.explicitApiModeAsCompilerArg() val explicitApiFlag = project.kotlinExtension.explicitApiModeAsCompilerArg()
if (explicitApiFlag != null && sourceSet in sourceSetsInMainCompilation) { explicitApiFlag.takeIf { isMainSourceSet }
explicitApiFlag
} else {
null
}
} }
// Set ad-hoc free compiler args from the internal project property
freeCompilerArgsProvider = project.provider { languageSettings.freeCompilerArgsProvider = project.provider {
val propertyValue = with(project.extensions.extraProperties) { val propertyValue = with(project.extensions.extraProperties) {
val sourceSetFreeCompilerArgsPropertyName = sourceSetFreeCompilerArgsPropertyName(sourceSet.name) val sourceSetFreeCompilerArgsPropertyName = sourceSetFreeCompilerArgsPropertyName(sourceSet.name)
if (has(sourceSetFreeCompilerArgsPropertyName)) { if (has(sourceSetFreeCompilerArgsPropertyName)) {