Refactor Kotlin tasks provider & fix friend task matching with new MPP
* Parameterize with the target name and use it in the task names * Get rid of separate task providers for common and js, use the default with an appropriate target name
This commit is contained in:
+22
-13
@@ -454,16 +454,19 @@ internal fun configureDefaultVersionsResolutionStrategy(project: Project, kotlin
|
||||
}
|
||||
|
||||
internal open class KotlinPlugin(
|
||||
tasksProvider: KotlinTasksProvider,
|
||||
kotlinPluginVersion: String,
|
||||
registry: ToolingModelBuilderRegistry
|
||||
) : AbstractKotlinPlugin(tasksProvider, kotlinPluginVersion, registry) {
|
||||
registry: ToolingModelBuilderRegistry
|
||||
) : AbstractKotlinPlugin(KotlinTasksProvider(targetName), kotlinPluginVersion, registry) {
|
||||
|
||||
companion object {
|
||||
private const val targetName = "" // use empty suffix for the task names
|
||||
}
|
||||
|
||||
override fun buildSourceSetProcessor(project: Project, compilation: KotlinCompilation, kotlinPluginVersion: String) =
|
||||
Kotlin2JvmSourceSetProcessor(project, tasksProvider, compilation, kotlinPluginVersion)
|
||||
|
||||
override fun apply(project: Project) {
|
||||
val target = KotlinWithJavaTarget(project, KotlinPlatformType.jvm, "").apply {
|
||||
val target = KotlinWithJavaTarget(project, KotlinPlatformType.jvm, targetName).apply {
|
||||
disambiguationClassifier = null // don't add anything to the task names
|
||||
}
|
||||
(project.kotlinExtension as KotlinSingleJavaTargetExtension).target = target
|
||||
@@ -474,10 +477,13 @@ internal open class KotlinPlugin(
|
||||
}
|
||||
|
||||
internal open class KotlinCommonPlugin(
|
||||
tasksProvider: KotlinTasksProvider,
|
||||
kotlinPluginVersion: String,
|
||||
registry: ToolingModelBuilderRegistry
|
||||
) : AbstractKotlinPlugin(tasksProvider, kotlinPluginVersion, registry) {
|
||||
registry: ToolingModelBuilderRegistry
|
||||
) : AbstractKotlinPlugin(KotlinTasksProvider(targetName), kotlinPluginVersion, registry) {
|
||||
|
||||
companion object {
|
||||
private const val targetName = "common"
|
||||
}
|
||||
|
||||
override fun buildSourceSetProcessor(
|
||||
project: Project,
|
||||
@@ -487,7 +493,7 @@ internal open class KotlinCommonPlugin(
|
||||
KotlinCommonSourceSetProcessor(project, compilation, tasksProvider, kotlinPluginVersion)
|
||||
|
||||
override fun apply(project: Project) {
|
||||
val target = KotlinWithJavaTarget(project, KotlinPlatformType.common, "common")
|
||||
val target = KotlinWithJavaTarget(project, KotlinPlatformType.common, targetName)
|
||||
(project.kotlinExtension as KotlinSingleJavaTargetExtension).target = target
|
||||
|
||||
super.apply(project)
|
||||
@@ -495,10 +501,13 @@ internal open class KotlinCommonPlugin(
|
||||
}
|
||||
|
||||
internal open class Kotlin2JsPlugin(
|
||||
tasksProvider: KotlinTasksProvider,
|
||||
kotlinPluginVersion: String,
|
||||
registry: ToolingModelBuilderRegistry
|
||||
) : AbstractKotlinPlugin(tasksProvider, kotlinPluginVersion, registry) {
|
||||
registry: ToolingModelBuilderRegistry
|
||||
) : AbstractKotlinPlugin(KotlinTasksProvider(targetName), kotlinPluginVersion, registry) {
|
||||
|
||||
companion object {
|
||||
private const val targetName = "2Js"
|
||||
}
|
||||
|
||||
override fun buildSourceSetProcessor(
|
||||
project: Project,
|
||||
@@ -510,7 +519,7 @@ internal open class Kotlin2JsPlugin(
|
||||
)
|
||||
|
||||
override fun apply(project: Project) {
|
||||
val target = KotlinWithJavaTarget(project, KotlinPlatformType.js, "2Js")
|
||||
val target = KotlinWithJavaTarget(project, KotlinPlatformType.js, targetName)
|
||||
|
||||
(project.kotlinExtension as KotlinSingleJavaTargetExtension).target = target
|
||||
super.apply(project)
|
||||
@@ -518,12 +527,12 @@ internal open class Kotlin2JsPlugin(
|
||||
}
|
||||
|
||||
internal open class KotlinAndroidPlugin(
|
||||
val tasksProvider: KotlinTasksProvider,
|
||||
private val kotlinPluginVersion: String
|
||||
) : Plugin<Project> {
|
||||
|
||||
override fun apply(project: Project) {
|
||||
val androidTarget = KotlinAndroidTarget("", project)
|
||||
val tasksProvider = AndroidTasksProvider(androidTarget.targetName)
|
||||
|
||||
applyToTarget(
|
||||
project, androidTarget, tasksProvider,
|
||||
|
||||
+6
-9
@@ -29,8 +29,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
|
||||
import org.jetbrains.kotlin.gradle.plugin.source.KotlinSourceSet
|
||||
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
|
||||
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory
|
||||
import org.jetbrains.kotlin.gradle.tasks.*
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE
|
||||
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP
|
||||
import java.io.FileNotFoundException
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
@@ -82,7 +82,7 @@ open class KotlinPluginWrapper @Inject constructor(
|
||||
protected val registry: ToolingModelBuilderRegistry
|
||||
): KotlinBasePluginWrapper(fileResolver) {
|
||||
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
||||
KotlinPlugin(KotlinTasksProvider(), kotlinPluginVersion, registry)
|
||||
KotlinPlugin(kotlinPluginVersion, registry)
|
||||
|
||||
override val projectExtensionClass: KClass<out KotlinJvmProjectExtension>
|
||||
get() = KotlinJvmProjectExtension::class
|
||||
@@ -93,7 +93,7 @@ open class KotlinCommonPluginWrapper @Inject constructor(
|
||||
protected val registry: ToolingModelBuilderRegistry
|
||||
): KotlinBasePluginWrapper(fileResolver) {
|
||||
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
||||
KotlinCommonPlugin(KotlinCommonTasksProvider(), kotlinPluginVersion, registry)
|
||||
KotlinCommonPlugin(kotlinPluginVersion, registry)
|
||||
|
||||
override val projectExtensionClass: KClass<out KotlinSingleJavaTargetExtension>
|
||||
get() = KotlinSingleJavaTargetExtension::class
|
||||
@@ -104,10 +104,7 @@ open class KotlinAndroidPluginWrapper @Inject constructor(
|
||||
protected val registry: ToolingModelBuilderRegistry
|
||||
): KotlinBasePluginWrapper(fileResolver) {
|
||||
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
||||
KotlinAndroidPlugin(
|
||||
AndroidTasksProvider(),
|
||||
kotlinPluginVersion
|
||||
)
|
||||
KotlinAndroidPlugin(kotlinPluginVersion)
|
||||
}
|
||||
|
||||
open class Kotlin2JsPluginWrapper @Inject constructor(
|
||||
@@ -115,7 +112,7 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
|
||||
protected val registry: ToolingModelBuilderRegistry
|
||||
): KotlinBasePluginWrapper(fileResolver) {
|
||||
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
||||
Kotlin2JsPlugin(Kotlin2JsTasksProvider(), kotlinPluginVersion, registry)
|
||||
Kotlin2JsPlugin(kotlinPluginVersion, registry)
|
||||
|
||||
override val projectExtensionClass: KClass<out KotlinSingleJavaTargetExtension>
|
||||
get() = KotlinSingleJavaTargetExtension::class
|
||||
|
||||
+5
-6
@@ -33,18 +33,17 @@ internal abstract class TaskToFriendTaskMapper {
|
||||
sealed internal class RegexTaskToFriendTaskMapper(
|
||||
private val prefix: String,
|
||||
suffix: String,
|
||||
private val targetName: String,
|
||||
private val postfixReplacement: String
|
||||
) : TaskToFriendTaskMapper() {
|
||||
class Default : RegexTaskToFriendTaskMapper("compile", "TestKotlin(AfterJava)?", "Kotlin")
|
||||
class JavaScript : RegexTaskToFriendTaskMapper("compile", "TestKotlin2Js", "Kotlin2Js")
|
||||
class Common : RegexTaskToFriendTaskMapper("compile", "TestKotlinCommon", "KotlinCommon")
|
||||
class Android : RegexTaskToFriendTaskMapper("compile", "(Unit|Android)TestKotlin(AfterJava)?", "Kotlin")
|
||||
class Default(targetName: String) : RegexTaskToFriendTaskMapper("compile", "TestKotlin", targetName, "Kotlin")
|
||||
class Android(targetName: String) : RegexTaskToFriendTaskMapper("compile", "(Unit|Android)TestKotlin", targetName, "Kotlin")
|
||||
|
||||
private val regex = "$prefix(.*)$suffix".toRegex()
|
||||
private val regex = "$prefix(.*)$suffix${targetName.capitalize()}".toRegex()
|
||||
|
||||
override fun getFriendByName(name: String): String? {
|
||||
val match = regex.matchEntire(name) ?: return null
|
||||
val variant = match.groups[1]?.value ?: ""
|
||||
return prefix + variant + postfixReplacement
|
||||
return prefix + variant + postfixReplacement + targetName.capitalize()
|
||||
}
|
||||
}
|
||||
+5
-8
@@ -12,8 +12,6 @@ import org.gradle.internal.cleanup.BuildOutputCleanupRegistry
|
||||
import org.gradle.internal.reflect.Instantiator
|
||||
import org.jetbrains.kotlin.gradle.plugin.*
|
||||
import org.jetbrains.kotlin.gradle.tasks.AndroidTasksProvider
|
||||
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsTasksProvider
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCommonTasksProvider
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
|
||||
|
||||
abstract class KotlinOnlyTargetPreset<T : KotlinCompilation>(
|
||||
@@ -74,7 +72,7 @@ class KotlinUniversalTargetPreset(
|
||||
KotlinCommonSourceSetProcessor(
|
||||
project,
|
||||
compilation,
|
||||
KotlinCommonTasksProvider(),
|
||||
KotlinTasksProvider(compilation.target.targetName),
|
||||
kotlinPluginVersion
|
||||
)
|
||||
|
||||
@@ -105,7 +103,7 @@ class KotlinJvmTargetPreset(
|
||||
get() = KotlinPlatformType.jvm
|
||||
|
||||
override fun buildCompilationProcessor(compilation: KotlinJvmCompilation): KotlinSourceSetProcessor<*> =
|
||||
Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(), compilation, kotlinPluginVersion)
|
||||
Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(compilation.target.targetName), compilation, kotlinPluginVersion)
|
||||
|
||||
companion object {
|
||||
const val PRESET_NAME = "jvm"
|
||||
@@ -134,7 +132,7 @@ class KotlinJsTargetPreset(
|
||||
get() = KotlinPlatformType.js
|
||||
|
||||
override fun buildCompilationProcessor(compilation: KotlinJsCompilation): KotlinSourceSetProcessor<*> =
|
||||
Kotlin2JsSourceSetProcessor(project, Kotlin2JsTasksProvider(), compilation, kotlinPluginVersion)
|
||||
Kotlin2JsSourceSetProcessor(project, KotlinTasksProvider(compilation.target.targetName), compilation, kotlinPluginVersion)
|
||||
|
||||
companion object {
|
||||
const val PRESET_NAME = "js"
|
||||
@@ -154,11 +152,10 @@ class KotlinAndroidTargetPreset(
|
||||
}
|
||||
|
||||
KotlinAndroidPlugin.applyToTarget(
|
||||
project, result, AndroidTasksProvider(),
|
||||
project, result, AndroidTasksProvider(name),
|
||||
kotlinPluginVersion
|
||||
)
|
||||
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -182,7 +179,7 @@ class KotlinJvmWithJavaTargetPreset(
|
||||
}
|
||||
|
||||
AbstractKotlinPlugin.configureTarget(target) { compilation ->
|
||||
Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(), compilation, kotlinPluginVersion)
|
||||
Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(name), compilation, kotlinPluginVersion)
|
||||
}
|
||||
|
||||
target.compilations.all { compilation ->
|
||||
|
||||
+4
-14
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.gradle.plugin.RegexTaskToFriendTaskMapper
|
||||
import org.jetbrains.kotlin.gradle.plugin.TaskToFriendTaskMapper
|
||||
import org.jetbrains.kotlin.gradle.plugin.mapKotlinTaskProperties
|
||||
|
||||
internal open class KotlinTasksProvider {
|
||||
internal open class KotlinTasksProvider(val targetName: String) {
|
||||
open fun createKotlinJVMTask(project: Project, name: String, sourceSetName: String): KotlinCompile =
|
||||
project.tasks.create(name, KotlinCompile::class.java).apply {
|
||||
configure(this, project, sourceSetName)
|
||||
@@ -48,22 +48,12 @@ internal open class KotlinTasksProvider {
|
||||
}
|
||||
|
||||
protected open val taskToFriendTaskMapper: TaskToFriendTaskMapper =
|
||||
RegexTaskToFriendTaskMapper.Default()
|
||||
RegexTaskToFriendTaskMapper.Default(targetName)
|
||||
}
|
||||
|
||||
internal class KotlinCommonTasksProvider : KotlinTasksProvider() {
|
||||
internal class AndroidTasksProvider(targetName: String) : KotlinTasksProvider(targetName) {
|
||||
override val taskToFriendTaskMapper: TaskToFriendTaskMapper =
|
||||
RegexTaskToFriendTaskMapper.Common()
|
||||
}
|
||||
|
||||
internal class Kotlin2JsTasksProvider : KotlinTasksProvider() {
|
||||
override val taskToFriendTaskMapper: TaskToFriendTaskMapper =
|
||||
RegexTaskToFriendTaskMapper.JavaScript()
|
||||
}
|
||||
|
||||
internal class AndroidTasksProvider : KotlinTasksProvider() {
|
||||
override val taskToFriendTaskMapper: TaskToFriendTaskMapper =
|
||||
RegexTaskToFriendTaskMapper.Android()
|
||||
RegexTaskToFriendTaskMapper.Android(targetName)
|
||||
|
||||
override fun configure(kotlinTask: AbstractKotlinCompile<*>, project: Project, sourceSetName: String) {
|
||||
super.configure(kotlinTask, project, sourceSetName)
|
||||
|
||||
+24
-6
@@ -22,21 +22,22 @@ import org.junit.Test
|
||||
class RegexTaskToFriendTaskMapperTest {
|
||||
@Test
|
||||
fun getFriendTaskNameDefault() {
|
||||
val mapper = RegexTaskToFriendTaskMapper.Default()
|
||||
val mapper = RegexTaskToFriendTaskMapper.Default("")
|
||||
Assert.assertEquals("compileKotlin", mapper["compileTestKotlin"])
|
||||
Assert.assertEquals(null, mapper["compileKotlin"])
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getFriendTasksNameJavaScript() {
|
||||
val mapper = RegexTaskToFriendTaskMapper.JavaScript()
|
||||
Assert.assertEquals("compileKotlin2Js", mapper["compileTestKotlin2Js"])
|
||||
Assert.assertEquals(null, mapper["compileKotlin2Js"])
|
||||
fun getFriendTaskNameCustomTargetName() {
|
||||
val mapper = RegexTaskToFriendTaskMapper.Default("Foo")
|
||||
Assert.assertEquals("compileKotlinFoo", mapper["compileTestKotlinFoo"])
|
||||
Assert.assertEquals(null, mapper["compileKotlinFoo"])
|
||||
Assert.assertEquals(null, mapper["compileTestKotlinBar"])
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getFriendTaskNameAndroid() {
|
||||
val mapper = RegexTaskToFriendTaskMapper.Android()
|
||||
val mapper = RegexTaskToFriendTaskMapper.Android("")
|
||||
// Unit test examples
|
||||
Assert.assertEquals("compileDebugKotlin", mapper["compileDebugUnitTestKotlin"])
|
||||
Assert.assertEquals("compileReleaseKotlin", mapper["compileReleaseUnitTestKotlin"])
|
||||
@@ -48,4 +49,21 @@ class RegexTaskToFriendTaskMapperTest {
|
||||
|
||||
Assert.assertEquals(null, mapper["compileDebugKotlin"])
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getFriendTaskNameAndroidCustomTargetName() {
|
||||
val mapper = RegexTaskToFriendTaskMapper.Android("Foo")
|
||||
// Unit test examples
|
||||
Assert.assertEquals("compileDebugKotlinFoo", mapper["compileDebugUnitTestKotlinFoo"])
|
||||
Assert.assertEquals("compileReleaseKotlinFoo", mapper["compileReleaseUnitTestKotlinFoo"])
|
||||
Assert.assertEquals("compileProdDebugKotlinFoo", mapper["compileProdDebugUnitTestKotlinFoo"])
|
||||
// Android test examples
|
||||
Assert.assertEquals("compileDebugKotlinFoo", mapper["compileDebugAndroidTestKotlinFoo"])
|
||||
Assert.assertEquals("compileReleaseKotlinFoo", mapper["compileReleaseAndroidTestKotlinFoo"])
|
||||
Assert.assertEquals("compileProdDebugKotlinFoo", mapper["compileProdDebugAndroidTestKotlinFoo"])
|
||||
|
||||
Assert.assertEquals(null, mapper["compileDebugKotlinFoo"])
|
||||
Assert.assertEquals(null, mapper["compileDebugUnitTestKotlinBar"])
|
||||
Assert.assertEquals(null, mapper["compileDebugAndroidTestKotlinBar"])
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user