From 9b8128aaa8628d641fd05fd582328d048241e961 Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Fri, 10 Jul 2020 11:21:00 +0700 Subject: [PATCH] Coerce commonTest to common in HMPP Otherwise, Android import won't add dependency from androidTest to commoonTest. See KT-38744 for details ^KT-38744 Fixed --- .../src/KotlinMPPGradleModelBuilder.kt | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt index f3dc51bc940..19c8f6aed8e 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt @@ -20,6 +20,8 @@ import org.gradle.api.provider.Provider import org.gradle.api.tasks.Exec import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.KotlinMPPGradleModel.Companion.NO_KOTLIN_NATIVE_HOME +import org.jetbrains.kotlin.gradle.KotlinSourceSet.Companion.COMMON_MAIN_SOURCE_SET_NAME +import org.jetbrains.kotlin.gradle.KotlinSourceSet.Companion.COMMON_TEST_SOURCE_SET_NAME import org.jetbrains.plugins.gradle.DefaultExternalDependencyId import org.jetbrains.plugins.gradle.model.* import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder @@ -58,7 +60,7 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { val sourceSets = buildSourceSets(dependencyResolver, project, dependencyMapper) ?: return null val sourceSetMap = sourceSets.map { it.name to it }.toMap() val targets = buildTargets(projectTargets, sourceSetMap, dependencyResolver, project, dependencyMapper) ?: return null - computeSourceSetsDeferredInfo(sourceSetMap, targets, isHMPPEnabled(project)) + computeSourceSetsDeferredInfo(sourceSetMap, targets, isHMPPEnabled(project), shouldCoerceRootSourceSetToCommon(project)) val coroutinesState = getCoroutinesState(project) reportUnresolvedDependencies(targets) val kotlinNativeHome = KotlinNativeHomeEvaluator.getKotlinNativeHome(project) ?: NO_KOTLIN_NATIVE_HOME @@ -94,6 +96,10 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { return (project.findProperty("kotlin.mpp.enableGranularSourceSetsMetadata") as? String)?.toBoolean() ?: false } + private fun shouldCoerceRootSourceSetToCommon(project: Project): Boolean { + return (project.findProperty("kotlin.mpp.coerceRootSourceSetsToCommon") as? String)?.toBoolean() ?: true + } + private fun isNativeDependencyPropagationEnabled(project: Project): Boolean { return (project.findProperty("kotlin.native.enableDependencyPropagation") as? String)?.toBoolean() ?: true } @@ -771,7 +777,8 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { private fun computeSourceSetsDeferredInfo( sourceSets: Map, targets: Collection, - isHMPPEnabled: Boolean + isHMPPEnabled: Boolean, + coerceRootSourceSetsToCommon: Boolean ) { // includes only compilations where source set is listed val compiledSourceSetToCompilations = LinkedHashMap>() @@ -810,12 +817,32 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { val platforms = compilations.map { it.platform } sourceSet.actualPlatforms.addSimplePlatforms(platforms) } - if ((!isHMPPEnabled) && sourceSet.actualPlatforms.platforms.size != 1) { + + if (sourceSet.shouldCoerceToCommon(isHMPPEnabled, coerceRootSourceSetsToCommon)) { sourceSet.actualPlatforms.addSimplePlatforms(listOf(KotlinPlatform.COMMON)) } } } + private fun KotlinSourceSetImpl.shouldCoerceToCommon(isHMPPEnabled: Boolean, coerceRootSourceSetsToCommon: Boolean): Boolean { + val isRoot = name == COMMON_MAIN_SOURCE_SET_NAME || name == COMMON_TEST_SOURCE_SET_NAME + + // never makes sense to coerce single-targeted source-sets + if (actualPlatforms.platforms.size == 1) return false + + return when { + // pre-HMPP has only single-targeted source sets and COMMON + !isHMPPEnabled -> true + + // in HMPP, we might want to coerce source sets to common, but only root ones, and only + // when the corresponding setting is turned on + isHMPPEnabled && isRoot && coerceRootSourceSetsToCommon -> true + + // in all other cases, in HMPP we shouldn't coerce anything + else -> false + } + } + private class DependencyAdjuster( private val configuration: Configuration, private val scope: String,