[Gradle] GetCommonizerTargetOfSourceSet: Simplify implementation by only relying on compilations

This commit is contained in:
sebastian.sellmair
2021-06-21 16:37:40 +02:00
committed by Space
parent 19b99d5d91
commit 5a8b39e08d
2 changed files with 14 additions and 49 deletions
@@ -9,8 +9,10 @@
package org.jetbrains.kotlin.gradle package org.jetbrains.kotlin.gradle
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.ExtraPropertiesExtension
import org.gradle.testfixtures.ProjectBuilder import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.kotlin.commonizer.CommonizerTarget import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
import org.jetbrains.kotlin.konan.target.KonanTarget.* import org.jetbrains.kotlin.konan.target.KonanTarget.*
@@ -27,6 +29,7 @@ class SourceSetCommonizerTargetTest {
@BeforeTest @BeforeTest
fun setup() { fun setup() {
project = ProjectBuilder.builder().build() project = ProjectBuilder.builder().build()
project.extensions.getByType(ExtraPropertiesExtension::class.java).set("kotlin.mpp.enableCompatibilityMetadataVariant", "false")
project.plugins.apply("kotlin-multiplatform") project.plugins.apply("kotlin-multiplatform")
kotlin = project.extensions.getByName("kotlin") as KotlinMultiplatformExtension kotlin = project.extensions.getByName("kotlin") as KotlinMultiplatformExtension
@@ -175,7 +178,10 @@ class SourceSetCommonizerTargetTest {
target.compilations.getByName("main").source(nativeMain) target.compilations.getByName("main").source(nativeMain)
} }
assertNull(project.getCommonizerTarget(nativeMain), "Expected no commonizer target, since no real source set hierarchy is given") assertEquals(
SharedCommonizerTarget(setOf(linux1.konanTarget, linux2.konanTarget)),
project.getCommonizerTarget(nativeMain)
)
} }
@Test @Test
@@ -7,61 +7,20 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.commonizer.CommonizerTarget import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.allLeaves import org.jetbrains.kotlin.commonizer.allLeaves
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilationsBySourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilationsBySourceSets
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllSourceSetsDependingOn
import org.jetbrains.kotlin.konan.target.KonanTarget
internal fun Project.getCommonizerTarget(sourceSet: KotlinSourceSet): CommonizerTarget? { internal fun Project.getCommonizerTarget(sourceSet: KotlinSourceSet): CommonizerTarget? {
val kotlin = multiplatformExtensionOrNull ?: return null val compilationTargets = compilationsBySourceSets(this)[sourceSet].orEmpty()
val sourceSetsDependingOnThisSourceSet = kotlin.resolveAllSourceSetsDependingOn(sourceSet) .filter { compilation -> compilation !is KotlinMetadataCompilation }
.filterNot(::isOrphanSourceSet) .map { compilation -> getCommonizerTarget(compilation) ?: return null }
if (sourceSetsDependingOnThisSourceSet.isEmpty()) {
return getLeafCommonizerTarget(sourceSet)
}
val dependeeCommonizerTargets = sourceSetsDependingOnThisSourceSet
.map { sourceSetDependingOnThisSourceSet -> getCommonizerTarget(sourceSetDependingOnThisSourceSet) ?: return null }
.toSet()
return when { return when {
dependeeCommonizerTargets.isEmpty() -> throw IllegalStateException() compilationTargets.isEmpty() -> null
dependeeCommonizerTargets.size == 1 -> dependeeCommonizerTargets.single() compilationTargets.size == 1 -> compilationTargets.single()
else -> SharedCommonizerTarget(dependeeCommonizerTargets.allLeaves()) else -> SharedCommonizerTarget(compilationTargets.allLeaves())
} }
} }
private fun Project.getLeafCommonizerTarget(sourceSet: KotlinSourceSet): LeafCommonizerTarget? {
val konanTargets = compilationsBySourceSets(this)[sourceSet].orEmpty()
.flatMap { compilation -> compilation.konanTargets }
return if (konanTargets.size == 1) LeafCommonizerTarget(konanTargets.single())
/*
Can even be more than one, when added using `KotlinCompilation.source`. Still returning null, since this
does not represent a 'proper' source set hierarchy
*/
else null
}
private fun Project.isOrphanSourceSet(sourceSet: KotlinSourceSet): Boolean {
return compilationsBySourceSets(this)[sourceSet].orEmpty().isEmpty()
}
private val KotlinCompilation<*>.konanTargets: Set<KonanTarget>
get() {
return when (this) {
is KotlinSharedNativeCompilation -> konanTargets.toSet()
is KotlinNativeCompilation -> setOf(konanTarget)
else -> emptySet()
}
}