[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
|
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
-48
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user