From ab8284d5b81cf9977248bb12e65a52da15a0de5d Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 1 Feb 2022 01:14:57 +0400 Subject: [PATCH] KPM, Model mapping: setup source paths for fragments by source set names When a fragment is represented as a source set in the mapped model, the source set name may differ from . For example, some source set names don't end with *Main or *Test. In case we can detect the source set that represents the fragment, use the source set name for the fragment's sources directory. --- .../KotlinSourceDirectoriesConfigurator.kt | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinSourceDirectoriesConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinSourceDirectoriesConfigurator.kt index d33498d8bbc..c9ddea5ed45 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinSourceDirectoriesConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinSourceDirectoriesConfigurator.kt @@ -5,7 +5,9 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 -import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull +import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import java.io.File @@ -14,16 +16,32 @@ interface KotlinSourceDirectoriesConfigurator: Kotl object DefaultKotlinSourceDirectoriesConfigurator : KotlinSourceDirectoriesConfigurator { override fun configure(fragment: KotlinGradleFragment) { fragment.kotlinSourceRoots.srcDir( - defaultSourceFolder( - project = fragment.project, - moduleName = fragment.containingModule.name, - fragmentName = fragment.fragmentName, - type = "kotlin" - ) + fragment.project.provider { + defaultSourceFolder( + fragment, + type = "kotlin" + ) + } ) } - fun defaultSourceFolder(project: Project, moduleName: String, fragmentName: String, type: String): File { - return project.file("src/${lowerCamelCaseName(fragmentName, moduleName)}/$type") + private fun fragmentDirectoryName(fragment: KotlinGradleFragment): String { + val project = fragment.project + val isModelMappingEnabled = project.multiplatformExtensionOrNull != null + val kpmDefaultResult = lowerCamelCaseName(fragment.name, fragment.containingModule.name) + return if (!isModelMappingEnabled) { + kpmDefaultResult + } else { + val sourceSet = + project.kotlinExtension.sourceSets.find { it is FragmentMappedKotlinSourceSet && it.underlyingFragment == fragment } + if (sourceSet != null) + sourceSet.name + else kpmDefaultResult + } + } + + fun defaultSourceFolder(fragment: KotlinGradleFragment, type: String): File { + val fragmentDirectoryName = fragmentDirectoryName(fragment) + return fragment.project.file("src/$fragmentDirectoryName/$type") } }