[Gradle] GetCommonizerTargetOfSourceSet: Simplify implementation by only relying on compilations
This commit is contained in:
committed by
Space
parent
19b99d5d91
commit
5a8b39e08d
+7
-1
@@ -9,8 +9,10 @@
|
||||
package org.jetbrains.kotlin.gradle
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.plugins.ExtraPropertiesExtension
|
||||
import org.gradle.testfixtures.ProjectBuilder
|
||||
import org.jetbrains.kotlin.commonizer.CommonizerTarget
|
||||
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
||||
import org.jetbrains.kotlin.gradle.targets.native.internal.getCommonizerTarget
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget.*
|
||||
@@ -27,6 +29,7 @@ class SourceSetCommonizerTargetTest {
|
||||
@BeforeTest
|
||||
fun setup() {
|
||||
project = ProjectBuilder.builder().build()
|
||||
project.extensions.getByType(ExtraPropertiesExtension::class.java).set("kotlin.mpp.enableCompatibilityMetadataVariant", "false")
|
||||
project.plugins.apply("kotlin-multiplatform")
|
||||
kotlin = project.extensions.getByName("kotlin") as KotlinMultiplatformExtension
|
||||
|
||||
@@ -175,7 +178,10 @@ class SourceSetCommonizerTargetTest {
|
||||
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
|
||||
|
||||
+7
-48
@@ -7,61 +7,20 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.jetbrains.kotlin.commonizer.CommonizerTarget
|
||||
import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget
|
||||
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
||||
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.mpp.CompilationSourceSetUtil.compilationsBySourceSets
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
|
||||
import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllSourceSetsDependingOn
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
|
||||
|
||||
internal fun Project.getCommonizerTarget(sourceSet: KotlinSourceSet): CommonizerTarget? {
|
||||
val kotlin = multiplatformExtensionOrNull ?: return null
|
||||
val sourceSetsDependingOnThisSourceSet = kotlin.resolveAllSourceSetsDependingOn(sourceSet)
|
||||
.filterNot(::isOrphanSourceSet)
|
||||
|
||||
if (sourceSetsDependingOnThisSourceSet.isEmpty()) {
|
||||
return getLeafCommonizerTarget(sourceSet)
|
||||
}
|
||||
|
||||
val dependeeCommonizerTargets = sourceSetsDependingOnThisSourceSet
|
||||
.map { sourceSetDependingOnThisSourceSet -> getCommonizerTarget(sourceSetDependingOnThisSourceSet) ?: return null }
|
||||
.toSet()
|
||||
val compilationTargets = compilationsBySourceSets(this)[sourceSet].orEmpty()
|
||||
.filter { compilation -> compilation !is KotlinMetadataCompilation }
|
||||
.map { compilation -> getCommonizerTarget(compilation) ?: return null }
|
||||
|
||||
return when {
|
||||
dependeeCommonizerTargets.isEmpty() -> throw IllegalStateException()
|
||||
dependeeCommonizerTargets.size == 1 -> dependeeCommonizerTargets.single()
|
||||
else -> SharedCommonizerTarget(dependeeCommonizerTargets.allLeaves())
|
||||
compilationTargets.isEmpty() -> null
|
||||
compilationTargets.size == 1 -> compilationTargets.single()
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user