From 5a8b39e08d8b25797d4ca4fc4fbb5b8fe4b40eb3 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Mon, 21 Jun 2021 16:37:40 +0200 Subject: [PATCH] [Gradle] GetCommonizerTargetOfSourceSet: Simplify implementation by only relying on compilations --- .../gradle/SourceSetCommonizerTargetTest.kt | 8 ++- .../GetCommonizerTargetOfSourceSet.kt | 55 +++---------------- 2 files changed, 14 insertions(+), 49 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt index 8b60c05f472..0e3087049c8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/SourceSetCommonizerTargetTest.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt index 54f1564c7e7..24aa732ec98 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/GetCommonizerTargetOfSourceSet.kt @@ -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 - get() { - return when (this) { - is KotlinSharedNativeCompilation -> konanTargets.toSet() - is KotlinNativeCompilation -> setOf(konanTarget) - else -> emptySet() - } - } -