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:
Sergey Igushkin
2018-08-01 22:12:44 +03:00
parent d4f44e63cd
commit 93943a565c
6 changed files with 66 additions and 56 deletions
@@ -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,
@@ -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
@@ -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()
}
}
@@ -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 ->
@@ -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)
@@ -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"])
}
}