KT-MR-5666 SourceSetMappedFragmentLocator
* fix choosing longest module name (did mistakenly choose shortest) * fix missing return for single-part name * add unit tests
This commit is contained in:
+106
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Associate compilations are not yet supported by the IDE. KT-34102 */
|
||||||
|
@file:Suppress("invisible_reference", "invisible_member", "FunctionName", "DuplicatedCode")
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.sources.kpm
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.MultiplatformExtensionTest
|
||||||
|
import kotlin.test.BeforeTest
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.kpm.MultiplatformSourceSetMappedFragmentLocator
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.kpmModules
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.sources.kpm.SourceSetMappedFragmentLocator
|
||||||
|
|
||||||
|
internal open class MultiplatformSourceSetMappedFragmentLocatorTest : MultiplatformExtensionTest() {
|
||||||
|
|
||||||
|
protected val locator = MultiplatformSourceSetMappedFragmentLocator()
|
||||||
|
|
||||||
|
@BeforeTest
|
||||||
|
override fun setup() {
|
||||||
|
project.extensions.extraProperties.set(PropertiesProvider.PropertyNames.KOTLIN_KPM_EXPERIMENTAL_MODEL_MAPPING, "true")
|
||||||
|
super.setup()
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun doTest(sourceSetName: String, checkResult: SourceSetMappedFragmentLocator.FragmentLocation.() -> Unit) {
|
||||||
|
val result = checkNotNull(locator.locateFragmentForSourceSet(project, sourceSetName))
|
||||||
|
checkResult(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun doTest(sourceSetName: String, fragmentName: String, moduleName: String) {
|
||||||
|
doTest(sourceSetName) {
|
||||||
|
assertEquals(fragmentName, this.fragmentName)
|
||||||
|
assertEquals(moduleName, this.moduleName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `name with one part is returned as fragment name with main module`() {
|
||||||
|
doTest("foo", "foo", KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `main is truncated from name`() {
|
||||||
|
doTest("fooBarMain", "fooBar", KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `module chosen for test fragment`() {
|
||||||
|
doTest("abcDefGhiTest", "abcDefGhi", KotlinGradleModule.TEST_MODULE_NAME)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `digits accepted`() {
|
||||||
|
val nameWithDigits = "testDigits123Accepted123"
|
||||||
|
project.kpmModules.create(nameWithDigits)
|
||||||
|
doTest("foo${nameWithDigits.capitalize()}", "foo", nameWithDigits)
|
||||||
|
doTest("${nameWithDigits}Main", nameWithDigits, KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `capitalized name handling`() {
|
||||||
|
doTest("IAmTheMain", "IAmThe", KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `live module logic update`() {
|
||||||
|
val nameForTest = "someNewTest"
|
||||||
|
doTest(nameForTest, "someNew", "test")
|
||||||
|
project.kpmModules.create("newTest")
|
||||||
|
doTest(nameForTest, "some", "newTest")
|
||||||
|
|
||||||
|
// also check for the same logic in fragments that go to main if no suffix matched:
|
||||||
|
|
||||||
|
val nameForMain = "fooBarBaz"
|
||||||
|
doTest(nameForMain, nameForMain, KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
val moduleSuffixName = "barBaz"
|
||||||
|
project.kpmModules.create(moduleSuffixName)
|
||||||
|
doTest(nameForMain, "foo", moduleSuffixName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class MultiplatformSourceSetMappedFragmentLocatorTestWithAndroid : MultiplatformSourceSetMappedFragmentLocatorTest() {
|
||||||
|
|
||||||
|
override fun setup() {
|
||||||
|
super.setup()
|
||||||
|
project.plugins.apply("android-library")
|
||||||
|
kotlin.android()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `android source set names`() {
|
||||||
|
doTest("androidMain", "android", KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
doTest("androidTest", "android", KotlinGradleModule.TEST_MODULE_NAME)
|
||||||
|
doTest("androidAndroidTest", "androidAndroid", KotlinGradleModule.TEST_MODULE_NAME)
|
||||||
|
|
||||||
|
doTest("androidDebug", "androidDebug", KotlinGradleModule.MAIN_MODULE_NAME)
|
||||||
|
doTest("androidDebugTest", "androidDebug", KotlinGradleModule.TEST_MODULE_NAME)
|
||||||
|
doTest("androidDebugAndroidTest", "androidDebugAndroid", KotlinGradleModule.TEST_MODULE_NAME)
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-1
@@ -224,7 +224,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
get() = booleanProperty("kotlin.wasm.stability.nowarn") ?: false
|
get() = booleanProperty("kotlin.wasm.stability.nowarn") ?: false
|
||||||
|
|
||||||
val experimentalKpmModelMapping: Boolean
|
val experimentalKpmModelMapping: Boolean
|
||||||
get() = booleanProperty("kotlin.kpm.experimentalModelMapping") ?: false
|
get() = booleanProperty(PropertyNames.KOTLIN_KPM_EXPERIMENTAL_MODEL_MAPPING) ?: false
|
||||||
|
|
||||||
val ignoreDisabledNativeTargets: Boolean?
|
val ignoreDisabledNativeTargets: Boolean?
|
||||||
get() = booleanProperty(DisabledNativeTargetsReporter.DISABLE_WARNING_PROPERTY_NAME)
|
get() = booleanProperty(DisabledNativeTargetsReporter.DISABLE_WARNING_PROPERTY_NAME)
|
||||||
@@ -488,6 +488,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
const val KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT = "kotlin.mpp.hierarchicalStructureSupport"
|
const val KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT = "kotlin.mpp.hierarchicalStructureSupport"
|
||||||
const val KOTLIN_NATIVE_DEPENDENCY_PROPAGATION = "kotlin.native.enableDependencyPropagation"
|
const val KOTLIN_NATIVE_DEPENDENCY_PROPAGATION = "kotlin.native.enableDependencyPropagation"
|
||||||
const val KOTLIN_MPP_ENABLE_OPTIMISTIC_NUMBER_COMMONIZATION = "kotlin.mpp.enableOptimisticNumberCommonization"
|
const val KOTLIN_MPP_ENABLE_OPTIMISTIC_NUMBER_COMMONIZATION = "kotlin.mpp.enableOptimisticNumberCommonization"
|
||||||
|
const val KOTLIN_KPM_EXPERIMENTAL_MODEL_MAPPING = "kotlin.kpm.experimentalModelMapping"
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+2
-3
@@ -17,9 +17,8 @@ class FragmentMappedKotlinSourceSetFactory constructor(private val project: Proj
|
|||||||
override fun create(name: String): FragmentMappedKotlinSourceSet {
|
override fun create(name: String): FragmentMappedKotlinSourceSet {
|
||||||
val locator = SourceSetMappedFragmentLocator.get(project)
|
val locator = SourceSetMappedFragmentLocator.get(project)
|
||||||
val location = locator.locateFragmentForSourceSet(project, name) ?: error("Couldn't map the source set name $name to KPM fragment")
|
val location = locator.locateFragmentForSourceSet(project, name) ?: error("Couldn't map the source set name $name to KPM fragment")
|
||||||
val (moduleName, fragmentName) = location
|
val fragment = project.kpmModules.maybeCreate(location.moduleName).fragments.maybeCreate(location.fragmentName)
|
||||||
val modules = project.kpmModules
|
|
||||||
val fragment = modules.maybeCreate(moduleName).fragments.maybeCreate(fragmentName)
|
|
||||||
/** TODO setup JS-specific attributes similar to [org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory]*/
|
/** TODO setup JS-specific attributes similar to [org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory]*/
|
||||||
return FragmentMappedKotlinSourceSet(name, project, fragment)
|
return FragmentMappedKotlinSourceSet(name, project, fragment)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-5
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.gradle.plugin.sources.kpm
|
|||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.jetbrains.kotlin.gradle.dsl.*
|
import org.jetbrains.kotlin.gradle.dsl.*
|
||||||
import org.jetbrains.kotlin.gradle.dsl.pm20Extension
|
|
||||||
import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
|
import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTargetPreset
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTargetPreset
|
||||||
@@ -33,11 +32,11 @@ interface SourceSetMappedFragmentLocator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MultiplatformSourceSetMappedFragmentLocator : SourceSetMappedFragmentLocator {
|
internal class MultiplatformSourceSetMappedFragmentLocator : SourceSetMappedFragmentLocator {
|
||||||
override fun locateFragmentForSourceSet(project: Project, sourceSetName: String): SourceSetMappedFragmentLocator.FragmentLocation? {
|
override fun locateFragmentForSourceSet(project: Project, sourceSetName: String): SourceSetMappedFragmentLocator.FragmentLocation {
|
||||||
val camelCaseParts = sourceSetName.camelCaseParts()
|
val camelCaseParts = sourceSetName.camelCaseParts()
|
||||||
if (camelCaseParts.size < 2) {
|
if (camelCaseParts.size < 2) {
|
||||||
SourceSetMappedFragmentLocator.FragmentLocation(KotlinGradleModule.MAIN_MODULE_NAME, sourceSetName)
|
return SourceSetMappedFragmentLocator.FragmentLocation(KotlinGradleModule.MAIN_MODULE_NAME, sourceSetName)
|
||||||
}
|
}
|
||||||
|
|
||||||
val androidTarget = when (val ext = project.topLevelExtension) {
|
val androidTarget = when (val ext = project.topLevelExtension) {
|
||||||
@@ -55,7 +54,7 @@ private class MultiplatformSourceSetMappedFragmentLocator : SourceSetMappedFragm
|
|||||||
if (androidTarget != null && sourceSetName.startsWith(androidTarget.name))
|
if (androidTarget != null && sourceSetName.startsWith(androidTarget.name))
|
||||||
androidSourceSetModuleName(androidTarget.name, sourceSetName)
|
androidSourceSetModuleName(androidTarget.name, sourceSetName)
|
||||||
else null
|
else null
|
||||||
} ?: candidateModuleNames.firstOrNull { project.kpmModules.findByName(it) != null }
|
} ?: candidateModuleNames.lastOrNull { project.kpmModules.findByName(it) != null }
|
||||||
?: KotlinGradleModule.MAIN_MODULE_NAME
|
?: KotlinGradleModule.MAIN_MODULE_NAME
|
||||||
|
|
||||||
val fragmentName =
|
val fragmentName =
|
||||||
|
|||||||
Reference in New Issue
Block a user