[Gradle] KotlinSoftwareComponent: Use future instead of lazy

^KT-34662 Verification Pending
This commit is contained in:
Sebastian Sellmair
2023-03-15 13:51:30 +01:00
committed by Space Team
parent 50f4531c77
commit ab81e92932
3 changed files with 25 additions and 19 deletions
@@ -333,7 +333,7 @@ open class NewMultiplatformIT : BaseGradleIT() {
options = defaultBuildOptions().copy(jsCompilerType = jsCompilerType) options = defaultBuildOptions().copy(jsCompilerType = jsCompilerType)
) { ) {
assertSuccessful() assertSuccessful()
assertTasksSkipped(":compileCommonMainKotlinMetadata") assertTasksNotExecuted(":compileCommonMainKotlinMetadata")
assertTasksExecuted(*compileTasksNames.toTypedArray(), ":allMetadataJar") assertTasksExecuted(*compileTasksNames.toTypedArray(), ":allMetadataJar")
val groupDir = projectDir.resolve("repo/com/example") val groupDir = projectDir.resolve("repo/com/example")
@@ -21,11 +21,13 @@ import org.gradle.jvm.tasks.Jar
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterFinaliseCompilations
import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.markResolvable
import org.jetbrains.kotlin.gradle.targets.metadata.* import org.jetbrains.kotlin.gradle.targets.metadata.*
import org.jetbrains.kotlin.gradle.targets.metadata.COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.targets.metadata.COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.utils.Future
import org.jetbrains.kotlin.gradle.utils.future import org.jetbrains.kotlin.gradle.utils.future
import org.jetbrains.kotlin.gradle.utils.setProperty import org.jetbrains.kotlin.gradle.utils.setProperty
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
@@ -38,23 +40,30 @@ abstract class KotlinSoftwareComponent(
override fun getName(): String = name override fun getName(): String = name
private val metadataTarget get() = project.multiplatformExtension.metadata() private val metadataTarget get() = project.multiplatformExtension.metadata() as KotlinMetadataTarget
override fun getVariants(): Set<SoftwareComponent> = kotlinTargets private val _variants = project.future {
.filter { target -> target !is KotlinMetadataTarget } await(AfterFinaliseCompilations)
.flatMap { target -> kotlinTargets
val targetPublishableComponentNames = target.internal.kotlinComponents .filter { target -> target !is KotlinMetadataTarget }
.filter { component -> component.publishable } .flatMap { target ->
.map { component -> component.name } val targetPublishableComponentNames = target.internal.kotlinComponents
.toSet() .filter { component -> component.publishable }
.map { component -> component.name }
.toSet()
target.components.filter { it.name in targetPublishableComponentNames } target.components.filter { it.name in targetPublishableComponentNames }
}.toSet() }.toSet()
}
override fun getVariants(): Set<SoftwareComponent> = _variants.getOrThrow()
private val _usages: Future<Set<DefaultKotlinUsageContext>> = project.future {
metadataTarget.awaitMetadataCompilationsCreated()
private val _usages: Set<DefaultKotlinUsageContext> by lazy {
if (!project.isKotlinGranularMetadataEnabled) { if (!project.isKotlinGranularMetadataEnabled) {
val metadataCompilation = metadataTarget.compilations.getByName(MAIN_COMPILATION_NAME) val metadataCompilation = metadataTarget.compilations.getByName(MAIN_COMPILATION_NAME)
return@lazy metadataTarget.createUsageContexts(metadataCompilation) return@future metadataTarget.createUsageContexts(metadataCompilation)
} }
mutableSetOf<DefaultKotlinUsageContext>().apply { mutableSetOf<DefaultKotlinUsageContext>().apply {
@@ -70,7 +79,6 @@ abstract class KotlinSoftwareComponent(
overrideConfigurationArtifacts = project.setProperty { listOf(allMetadataArtifact) } overrideConfigurationArtifacts = project.setProperty { listOf(allMetadataArtifact) }
) )
if (project.isCompatibilityMetadataVariantEnabled) { if (project.isCompatibilityMetadataVariantEnabled) {
// Ensure that consumers who expect Kotlin 1.2.x metadata package can still get one: // Ensure that consumers who expect Kotlin 1.2.x metadata package can still get one:
// publish the old metadata artifact: // publish the old metadata artifact:
@@ -97,8 +105,9 @@ abstract class KotlinSoftwareComponent(
} }
} }
override fun getUsages(): Set<UsageContext> { override fun getUsages(): Set<UsageContext> {
return _usages.publishableUsages() return _usages.getOrThrow().publishableUsages()
} }
private suspend fun allPublishableCommonSourceSets() = getCommonSourceSetsForMetadataCompilation(project) + private suspend fun allPublishableCommonSourceSets() = getCommonSourceSetsForMetadataCompilation(project) +
@@ -290,10 +290,7 @@ class KotlinMetadataTargetConfigurator :
val project = target.project val project = target.project
val compilationName = sourceSet.name val compilationName = sourceSet.name
val platformCompilations = sourceSet.internal.awaitPlatformCompilations()
val platformCompilations = sourceSet.internal.compilations
.filter { it.target.name != KotlinMultiplatformPlugin.METADATA_TARGET_NAME }
val isNativeSourceSet = sourceSet.isNativeSourceSet.await() val isNativeSourceSet = sourceSet.isNativeSourceSet.await()
val compilationFactory: KotlinCompilationFactory<out KotlinCompilation<*>> = when { val compilationFactory: KotlinCompilationFactory<out KotlinCompilation<*>> = when {