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( internal open class KotlinPlugin(
tasksProvider: KotlinTasksProvider,
kotlinPluginVersion: String, kotlinPluginVersion: String,
registry: ToolingModelBuilderRegistry registry: ToolingModelBuilderRegistry
) : AbstractKotlinPlugin(tasksProvider, kotlinPluginVersion, registry) { ) : 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) = override fun buildSourceSetProcessor(project: Project, compilation: KotlinCompilation, kotlinPluginVersion: String) =
Kotlin2JvmSourceSetProcessor(project, tasksProvider, compilation, kotlinPluginVersion) Kotlin2JvmSourceSetProcessor(project, tasksProvider, compilation, kotlinPluginVersion)
override fun apply(project: Project) { 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 disambiguationClassifier = null // don't add anything to the task names
} }
(project.kotlinExtension as KotlinSingleJavaTargetExtension).target = target (project.kotlinExtension as KotlinSingleJavaTargetExtension).target = target
@@ -474,10 +477,13 @@ internal open class KotlinPlugin(
} }
internal open class KotlinCommonPlugin( internal open class KotlinCommonPlugin(
tasksProvider: KotlinTasksProvider,
kotlinPluginVersion: String, kotlinPluginVersion: String,
registry: ToolingModelBuilderRegistry registry: ToolingModelBuilderRegistry
) : AbstractKotlinPlugin(tasksProvider, kotlinPluginVersion, registry) { ) : AbstractKotlinPlugin(KotlinTasksProvider(targetName), kotlinPluginVersion, registry) {
companion object {
private const val targetName = "common"
}
override fun buildSourceSetProcessor( override fun buildSourceSetProcessor(
project: Project, project: Project,
@@ -487,7 +493,7 @@ internal open class KotlinCommonPlugin(
KotlinCommonSourceSetProcessor(project, compilation, tasksProvider, kotlinPluginVersion) KotlinCommonSourceSetProcessor(project, compilation, tasksProvider, kotlinPluginVersion)
override fun apply(project: Project) { 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 (project.kotlinExtension as KotlinSingleJavaTargetExtension).target = target
super.apply(project) super.apply(project)
@@ -495,10 +501,13 @@ internal open class KotlinCommonPlugin(
} }
internal open class Kotlin2JsPlugin( internal open class Kotlin2JsPlugin(
tasksProvider: KotlinTasksProvider,
kotlinPluginVersion: String, kotlinPluginVersion: String,
registry: ToolingModelBuilderRegistry registry: ToolingModelBuilderRegistry
) : AbstractKotlinPlugin(tasksProvider, kotlinPluginVersion, registry) { ) : AbstractKotlinPlugin(KotlinTasksProvider(targetName), kotlinPluginVersion, registry) {
companion object {
private const val targetName = "2Js"
}
override fun buildSourceSetProcessor( override fun buildSourceSetProcessor(
project: Project, project: Project,
@@ -510,7 +519,7 @@ internal open class Kotlin2JsPlugin(
) )
override fun apply(project: Project) { 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 (project.kotlinExtension as KotlinSingleJavaTargetExtension).target = target
super.apply(project) super.apply(project)
@@ -518,12 +527,12 @@ internal open class Kotlin2JsPlugin(
} }
internal open class KotlinAndroidPlugin( internal open class KotlinAndroidPlugin(
val tasksProvider: KotlinTasksProvider,
private val kotlinPluginVersion: String private val kotlinPluginVersion: String
) : Plugin<Project> { ) : Plugin<Project> {
override fun apply(project: Project) { override fun apply(project: Project) {
val androidTarget = KotlinAndroidTarget("", project) val androidTarget = KotlinAndroidTarget("", project)
val tasksProvider = AndroidTasksProvider(androidTarget.targetName)
applyToTarget( applyToTarget(
project, androidTarget, tasksProvider, 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.source.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP
import java.io.FileNotFoundException import java.io.FileNotFoundException
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@@ -82,7 +82,7 @@ open class KotlinPluginWrapper @Inject constructor(
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
): KotlinBasePluginWrapper(fileResolver) { ): KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinPlugin(KotlinTasksProvider(), kotlinPluginVersion, registry) KotlinPlugin(kotlinPluginVersion, registry)
override val projectExtensionClass: KClass<out KotlinJvmProjectExtension> override val projectExtensionClass: KClass<out KotlinJvmProjectExtension>
get() = KotlinJvmProjectExtension::class get() = KotlinJvmProjectExtension::class
@@ -93,7 +93,7 @@ open class KotlinCommonPluginWrapper @Inject constructor(
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
): KotlinBasePluginWrapper(fileResolver) { ): KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinCommonPlugin(KotlinCommonTasksProvider(), kotlinPluginVersion, registry) KotlinCommonPlugin(kotlinPluginVersion, registry)
override val projectExtensionClass: KClass<out KotlinSingleJavaTargetExtension> override val projectExtensionClass: KClass<out KotlinSingleJavaTargetExtension>
get() = KotlinSingleJavaTargetExtension::class get() = KotlinSingleJavaTargetExtension::class
@@ -104,10 +104,7 @@ open class KotlinAndroidPluginWrapper @Inject constructor(
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
): KotlinBasePluginWrapper(fileResolver) { ): KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinAndroidPlugin( KotlinAndroidPlugin(kotlinPluginVersion)
AndroidTasksProvider(),
kotlinPluginVersion
)
} }
open class Kotlin2JsPluginWrapper @Inject constructor( open class Kotlin2JsPluginWrapper @Inject constructor(
@@ -115,7 +112,7 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
): KotlinBasePluginWrapper(fileResolver) { ): KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
Kotlin2JsPlugin(Kotlin2JsTasksProvider(), kotlinPluginVersion, registry) Kotlin2JsPlugin(kotlinPluginVersion, registry)
override val projectExtensionClass: KClass<out KotlinSingleJavaTargetExtension> override val projectExtensionClass: KClass<out KotlinSingleJavaTargetExtension>
get() = KotlinSingleJavaTargetExtension::class get() = KotlinSingleJavaTargetExtension::class
@@ -33,18 +33,17 @@ internal abstract class TaskToFriendTaskMapper {
sealed internal class RegexTaskToFriendTaskMapper( sealed internal class RegexTaskToFriendTaskMapper(
private val prefix: String, private val prefix: String,
suffix: String, suffix: String,
private val targetName: String,
private val postfixReplacement: String private val postfixReplacement: String
) : TaskToFriendTaskMapper() { ) : TaskToFriendTaskMapper() {
class Default : RegexTaskToFriendTaskMapper("compile", "TestKotlin(AfterJava)?", "Kotlin") class Default(targetName: String) : RegexTaskToFriendTaskMapper("compile", "TestKotlin", targetName, "Kotlin")
class JavaScript : RegexTaskToFriendTaskMapper("compile", "TestKotlin2Js", "Kotlin2Js") class Android(targetName: String) : RegexTaskToFriendTaskMapper("compile", "(Unit|Android)TestKotlin", targetName, "Kotlin")
class Common : RegexTaskToFriendTaskMapper("compile", "TestKotlinCommon", "KotlinCommon")
class Android : RegexTaskToFriendTaskMapper("compile", "(Unit|Android)TestKotlin(AfterJava)?", "Kotlin")
private val regex = "$prefix(.*)$suffix".toRegex() private val regex = "$prefix(.*)$suffix${targetName.capitalize()}".toRegex()
override fun getFriendByName(name: String): String? { override fun getFriendByName(name: String): String? {
val match = regex.matchEntire(name) ?: return null val match = regex.matchEntire(name) ?: return null
val variant = match.groups[1]?.value ?: "" 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.gradle.internal.reflect.Instantiator
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.tasks.AndroidTasksProvider 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 import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
abstract class KotlinOnlyTargetPreset<T : KotlinCompilation>( abstract class KotlinOnlyTargetPreset<T : KotlinCompilation>(
@@ -74,7 +72,7 @@ class KotlinUniversalTargetPreset(
KotlinCommonSourceSetProcessor( KotlinCommonSourceSetProcessor(
project, project,
compilation, compilation,
KotlinCommonTasksProvider(), KotlinTasksProvider(compilation.target.targetName),
kotlinPluginVersion kotlinPluginVersion
) )
@@ -105,7 +103,7 @@ class KotlinJvmTargetPreset(
get() = KotlinPlatformType.jvm get() = KotlinPlatformType.jvm
override fun buildCompilationProcessor(compilation: KotlinJvmCompilation): KotlinSourceSetProcessor<*> = override fun buildCompilationProcessor(compilation: KotlinJvmCompilation): KotlinSourceSetProcessor<*> =
Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(), compilation, kotlinPluginVersion) Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(compilation.target.targetName), compilation, kotlinPluginVersion)
companion object { companion object {
const val PRESET_NAME = "jvm" const val PRESET_NAME = "jvm"
@@ -134,7 +132,7 @@ class KotlinJsTargetPreset(
get() = KotlinPlatformType.js get() = KotlinPlatformType.js
override fun buildCompilationProcessor(compilation: KotlinJsCompilation): KotlinSourceSetProcessor<*> = override fun buildCompilationProcessor(compilation: KotlinJsCompilation): KotlinSourceSetProcessor<*> =
Kotlin2JsSourceSetProcessor(project, Kotlin2JsTasksProvider(), compilation, kotlinPluginVersion) Kotlin2JsSourceSetProcessor(project, KotlinTasksProvider(compilation.target.targetName), compilation, kotlinPluginVersion)
companion object { companion object {
const val PRESET_NAME = "js" const val PRESET_NAME = "js"
@@ -154,11 +152,10 @@ class KotlinAndroidTargetPreset(
} }
KotlinAndroidPlugin.applyToTarget( KotlinAndroidPlugin.applyToTarget(
project, result, AndroidTasksProvider(), project, result, AndroidTasksProvider(name),
kotlinPluginVersion kotlinPluginVersion
) )
return result return result
} }
@@ -182,7 +179,7 @@ class KotlinJvmWithJavaTargetPreset(
} }
AbstractKotlinPlugin.configureTarget(target) { compilation -> AbstractKotlinPlugin.configureTarget(target) { compilation ->
Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(), compilation, kotlinPluginVersion) Kotlin2JvmSourceSetProcessor(project, KotlinTasksProvider(name), compilation, kotlinPluginVersion)
} }
target.compilations.all { compilation -> 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.TaskToFriendTaskMapper
import org.jetbrains.kotlin.gradle.plugin.mapKotlinTaskProperties 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 = open fun createKotlinJVMTask(project: Project, name: String, sourceSetName: String): KotlinCompile =
project.tasks.create(name, KotlinCompile::class.java).apply { project.tasks.create(name, KotlinCompile::class.java).apply {
configure(this, project, sourceSetName) configure(this, project, sourceSetName)
@@ -48,22 +48,12 @@ internal open class KotlinTasksProvider {
} }
protected open val taskToFriendTaskMapper: TaskToFriendTaskMapper = 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 = override val taskToFriendTaskMapper: TaskToFriendTaskMapper =
RegexTaskToFriendTaskMapper.Common() RegexTaskToFriendTaskMapper.Android(targetName)
}
internal class Kotlin2JsTasksProvider : KotlinTasksProvider() {
override val taskToFriendTaskMapper: TaskToFriendTaskMapper =
RegexTaskToFriendTaskMapper.JavaScript()
}
internal class AndroidTasksProvider : KotlinTasksProvider() {
override val taskToFriendTaskMapper: TaskToFriendTaskMapper =
RegexTaskToFriendTaskMapper.Android()
override fun configure(kotlinTask: AbstractKotlinCompile<*>, project: Project, sourceSetName: String) { override fun configure(kotlinTask: AbstractKotlinCompile<*>, project: Project, sourceSetName: String) {
super.configure(kotlinTask, project, sourceSetName) super.configure(kotlinTask, project, sourceSetName)
@@ -22,21 +22,22 @@ import org.junit.Test
class RegexTaskToFriendTaskMapperTest { class RegexTaskToFriendTaskMapperTest {
@Test @Test
fun getFriendTaskNameDefault() { fun getFriendTaskNameDefault() {
val mapper = RegexTaskToFriendTaskMapper.Default() val mapper = RegexTaskToFriendTaskMapper.Default("")
Assert.assertEquals("compileKotlin", mapper["compileTestKotlin"]) Assert.assertEquals("compileKotlin", mapper["compileTestKotlin"])
Assert.assertEquals(null, mapper["compileKotlin"]) Assert.assertEquals(null, mapper["compileKotlin"])
} }
@Test @Test
fun getFriendTasksNameJavaScript() { fun getFriendTaskNameCustomTargetName() {
val mapper = RegexTaskToFriendTaskMapper.JavaScript() val mapper = RegexTaskToFriendTaskMapper.Default("Foo")
Assert.assertEquals("compileKotlin2Js", mapper["compileTestKotlin2Js"]) Assert.assertEquals("compileKotlinFoo", mapper["compileTestKotlinFoo"])
Assert.assertEquals(null, mapper["compileKotlin2Js"]) Assert.assertEquals(null, mapper["compileKotlinFoo"])
Assert.assertEquals(null, mapper["compileTestKotlinBar"])
} }
@Test @Test
fun getFriendTaskNameAndroid() { fun getFriendTaskNameAndroid() {
val mapper = RegexTaskToFriendTaskMapper.Android() val mapper = RegexTaskToFriendTaskMapper.Android("")
// Unit test examples // Unit test examples
Assert.assertEquals("compileDebugKotlin", mapper["compileDebugUnitTestKotlin"]) Assert.assertEquals("compileDebugKotlin", mapper["compileDebugUnitTestKotlin"])
Assert.assertEquals("compileReleaseKotlin", mapper["compileReleaseUnitTestKotlin"]) Assert.assertEquals("compileReleaseKotlin", mapper["compileReleaseUnitTestKotlin"])
@@ -48,4 +49,21 @@ class RegexTaskToFriendTaskMapperTest {
Assert.assertEquals(null, mapper["compileDebugKotlin"]) 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"])
}
} }