Refactoring: extract properties for gradle task's properties access in plugin
This commit is contained in:
+2
-5
@@ -32,7 +32,6 @@ fun Project.initKapt(
|
|||||||
javaTask: AbstractCompile,
|
javaTask: AbstractCompile,
|
||||||
kaptManager: AnnotationProcessingManager,
|
kaptManager: AnnotationProcessingManager,
|
||||||
variantName: String,
|
variantName: String,
|
||||||
kotlinOutputDir: File,
|
|
||||||
kotlinOptions: Any?,
|
kotlinOptions: Any?,
|
||||||
subpluginEnvironment: SubpluginEnvironment,
|
subpluginEnvironment: SubpluginEnvironment,
|
||||||
taskFactory: (suffix: String) -> AbstractCompile
|
taskFactory: (suffix: String) -> AbstractCompile
|
||||||
@@ -41,8 +40,7 @@ fun Project.initKapt(
|
|||||||
val kotlinAfterJavaTask: AbstractCompile?
|
val kotlinAfterJavaTask: AbstractCompile?
|
||||||
|
|
||||||
if (kaptExtension.generateStubs) {
|
if (kaptExtension.generateStubs) {
|
||||||
kotlinAfterJavaTask = createKotlinAfterJavaTask(javaTask, kotlinTask,
|
kotlinAfterJavaTask = createKotlinAfterJavaTask(javaTask, kotlinTask, kotlinOptions, taskFactory)
|
||||||
kotlinOutputDir, kotlinOptions, taskFactory)
|
|
||||||
|
|
||||||
kotlinTask.logger.kotlinDebug("kapt: Using class file stubs")
|
kotlinTask.logger.kotlinDebug("kapt: Using class file stubs")
|
||||||
|
|
||||||
@@ -89,12 +87,11 @@ fun Project.initKapt(
|
|||||||
private fun Project.createKotlinAfterJavaTask(
|
private fun Project.createKotlinAfterJavaTask(
|
||||||
javaTask: AbstractCompile,
|
javaTask: AbstractCompile,
|
||||||
kotlinTask: AbstractCompile,
|
kotlinTask: AbstractCompile,
|
||||||
kotlinOutputDir: File,
|
|
||||||
kotlinOptions: Any?,
|
kotlinOptions: Any?,
|
||||||
taskFactory: (suffix: String) -> AbstractCompile
|
taskFactory: (suffix: String) -> AbstractCompile
|
||||||
): AbstractCompile {
|
): AbstractCompile {
|
||||||
val kotlinAfterJavaTask = with (taskFactory(KOTLIN_AFTER_JAVA_TASK_SUFFIX)) {
|
val kotlinAfterJavaTask = with (taskFactory(KOTLIN_AFTER_JAVA_TASK_SUFFIX)) {
|
||||||
setProperty("kotlinDestinationDir", kotlinOutputDir)
|
kotlinDestinationDir = kotlinTask.kotlinDestinationDir
|
||||||
destinationDir = javaTask.destinationDir
|
destinationDir = javaTask.destinationDir
|
||||||
classpath = javaTask.classpath
|
classpath = javaTask.classpath
|
||||||
this
|
this
|
||||||
|
|||||||
+15
-20
@@ -130,9 +130,7 @@ class Kotlin2JvmSourceSetProcessor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun doTargetSpecificProcessing() {
|
override fun doTargetSpecificProcessing() {
|
||||||
// store kotlin classes in separate directory. They will serve as class-path to java compiler
|
kotlinTask.kotlinDestinationDir = File(project.buildDir, "kotlin-classes/$sourceSetName")
|
||||||
val kotlinDestinationDir = File(project.buildDir, "kotlin-classes/${sourceSetName}")
|
|
||||||
kotlinTask.setProperty("kotlinDestinationDir", kotlinDestinationDir)
|
|
||||||
|
|
||||||
val javaTask = project.tasks.findByName(sourceSet.compileJavaTaskName) as AbstractCompile?
|
val javaTask = project.tasks.findByName(sourceSet.compileJavaTaskName) as AbstractCompile?
|
||||||
if (javaTask != null) {
|
if (javaTask != null) {
|
||||||
@@ -166,7 +164,7 @@ class Kotlin2JvmSourceSetProcessor(
|
|||||||
aptConfiguration.resolve(), aptOutputDir, aptWorkingDir, tasksProvider.tasksLoader)
|
aptConfiguration.resolve(), aptOutputDir, aptWorkingDir, tasksProvider.tasksLoader)
|
||||||
|
|
||||||
val kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager,
|
val kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager,
|
||||||
sourceSetName, kotlinDestinationDir, null, subpluginEnvironment) {
|
sourceSetName, null, subpluginEnvironment) {
|
||||||
createKotlinCompileTask(it)
|
createKotlinCompileTask(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,7 +198,7 @@ class Kotlin2JsSourceSetProcessor(
|
|||||||
val build = project.tasks.findByName("build")
|
val build = project.tasks.findByName("build")
|
||||||
|
|
||||||
val defaultKotlinDestinationDir = File(project.buildDir, "kotlin2js/${sourceSetName}")
|
val defaultKotlinDestinationDir = File(project.buildDir, "kotlin2js/${sourceSetName}")
|
||||||
private fun kotlinTaskDestinationDir(): File? = kotlinTask.property("kotlinDestinationDir") as File?
|
private fun kotlinTaskDestinationDir(): File? = kotlinTask.kotlinDestinationDir
|
||||||
private fun kotlinJsDestinationDir(): File? = (kotlinTask.property("outputFile") as String).let { File(it) }.let { if (it.isDirectory) it else it.parentFile }
|
private fun kotlinJsDestinationDir(): File? = (kotlinTask.property("outputFile") as String).let { File(it) }.let { if (it.isDirectory) it else it.parentFile }
|
||||||
|
|
||||||
private fun kotlinSourcePathsForSourceMap() = sourceSet.getAllSource()
|
private fun kotlinSourcePathsForSourceMap() = sourceSet.getAllSource()
|
||||||
@@ -211,7 +209,7 @@ class Kotlin2JsSourceSetProcessor(
|
|||||||
private fun shouldGenerateSourceMap() = kotlinTask.property("sourceMap")
|
private fun shouldGenerateSourceMap() = kotlinTask.property("sourceMap")
|
||||||
|
|
||||||
override fun doTargetSpecificProcessing() {
|
override fun doTargetSpecificProcessing() {
|
||||||
kotlinTask.setProperty("kotlinDestinationDir", defaultKotlinDestinationDir)
|
kotlinTask.kotlinDestinationDir = defaultKotlinDestinationDir
|
||||||
build?.dependsOn(kotlinTaskName)
|
build?.dependsOn(kotlinTaskName)
|
||||||
clean?.dependsOn("clean" + kotlinTaskName.capitalize())
|
clean?.dependsOn("clean" + kotlinTaskName.capitalize())
|
||||||
|
|
||||||
@@ -366,8 +364,7 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand
|
|||||||
}
|
}
|
||||||
|
|
||||||
// store kotlin classes in separate directory. They will serve as class-path to java compiler
|
// store kotlin classes in separate directory. They will serve as class-path to java compiler
|
||||||
val kotlinOutputDir = File(project.buildDir, "tmp/kotlin-classes/${variantDataName}")
|
kotlinTask.kotlinDestinationDir = File(project.buildDir, "tmp/kotlin-classes/$variantDataName")
|
||||||
kotlinTask.setProperty("kotlinDestinationDir", kotlinOutputDir)
|
|
||||||
kotlinTask.destinationDir = javaTask.destinationDir
|
kotlinTask.destinationDir = javaTask.destinationDir
|
||||||
kotlinTask.description = "Compiles the ${variantDataName} kotlin."
|
kotlinTask.description = "Compiles the ${variantDataName} kotlin."
|
||||||
kotlinTask.classpath = javaTask.classpath
|
kotlinTask.classpath = javaTask.classpath
|
||||||
@@ -413,7 +410,7 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand
|
|||||||
|
|
||||||
kotlinTask.doFirst {
|
kotlinTask.doFirst {
|
||||||
val androidRT = project.files(AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt))
|
val androidRT = project.files(AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt))
|
||||||
val fullClasspath = (javaTask.classpath + androidRT) - project.files(kotlinTask.property("kotlinDestinationDir"))
|
val fullClasspath = (javaTask.classpath + androidRT) - project.files(kotlinTask.kotlinDestinationDir)
|
||||||
(it as AbstractCompile).classpath = fullClasspath
|
(it as AbstractCompile).classpath = fullClasspath
|
||||||
|
|
||||||
for (task in project.getTasksByName(kotlinTaskName + KOTLIN_AFTER_JAVA_TASK_SUFFIX, false)) {
|
for (task in project.getTasksByName(kotlinTaskName + KOTLIN_AFTER_JAVA_TASK_SUFFIX, false)) {
|
||||||
@@ -430,8 +427,7 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand
|
|||||||
|
|
||||||
kotlinTask.storeKaptAnnotationsFile(kaptManager)
|
kotlinTask.storeKaptAnnotationsFile(kaptManager)
|
||||||
|
|
||||||
project.initKapt(kotlinTask, javaTask, kaptManager, variantDataName,
|
project.initKapt(kotlinTask, javaTask, kaptManager, variantDataName, kotlinOptions, subpluginEnvironment) {
|
||||||
kotlinOutputDir, kotlinOptions, subpluginEnvironment) {
|
|
||||||
tasksProvider.createKotlinJVMTask(project, kotlinTaskName + KOTLIN_AFTER_JAVA_TASK_SUFFIX)
|
tasksProvider.createKotlinJVMTask(project, kotlinTaskName + KOTLIN_AFTER_JAVA_TASK_SUFFIX)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -456,16 +452,15 @@ private fun setUpKotlinToJavaDependency(project: Project, kotlinTask: AbstractCo
|
|||||||
// Since we cannot update classpath statically, java not able to detect changes in the classpath after kotlin compiler.
|
// Since we cannot update classpath statically, java not able to detect changes in the classpath after kotlin compiler.
|
||||||
// Therefore this (probably inefficient since java cannot decide "uptodateness" by the list of changed class files, but told
|
// Therefore this (probably inefficient since java cannot decide "uptodateness" by the list of changed class files, but told
|
||||||
// explicitly being out of date whenever any kotlin files are compiled
|
// explicitly being out of date whenever any kotlin files are compiled
|
||||||
if (kotlinTask.hasProperty("anyClassesCompiled")) {
|
if (kotlinTask.anyClassesCompiled != null) {
|
||||||
kotlinTask.property("anyClassesCompiled")?.let {
|
kotlinTask.anyClassesCompiled = false
|
||||||
kotlinTask.setProperty("anyClassesCompiled", false)
|
|
||||||
javaTask.outputs.upToDateWhen { task ->
|
javaTask.outputs.upToDateWhen { task ->
|
||||||
val kotlinClassesCompiled = kotlinTask.property("anyClassesCompiled") as? Boolean ?: false
|
val kotlinClassesCompiled = kotlinTask.anyClassesCompiled ?: false
|
||||||
if (kotlinClassesCompiled) {
|
if (kotlinClassesCompiled) {
|
||||||
logger.info("Marking $task out of date, because kotlin classes are changed")
|
logger.info("Marking $task out of date, because kotlin classes are changed")
|
||||||
}
|
|
||||||
!kotlinClassesCompiled
|
|
||||||
}
|
}
|
||||||
|
!kotlinClassesCompiled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
package org.jetbrains.kotlin.gradle.plugin
|
||||||
|
|
||||||
|
import org.gradle.api.internal.AbstractTask
|
||||||
|
import org.gradle.api.tasks.compile.AbstractCompile
|
||||||
|
import java.io.File
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
internal var AbstractTask.anyClassesCompiled: Boolean? by TaskPropertyDelegate("anyClassesCompiled")
|
||||||
|
internal var AbstractTask.kotlinDestinationDir: File? by TaskPropertyDelegate("kotlinDestinationDir")
|
||||||
|
|
||||||
|
inline
|
||||||
|
internal fun <reified T : Any> TaskPropertyDelegate(propertyName: String) =
|
||||||
|
TaskPropertyDelegate(propertyName, T::class.java)
|
||||||
|
|
||||||
|
internal class TaskPropertyDelegate<T : Any>(private val propertyName: String, private val klass: Class<T>) {
|
||||||
|
operator fun getValue(task: Any?, property: KProperty<*>): T? {
|
||||||
|
if (task !is AbstractCompile) throw IllegalStateException("TaskPropertyDelegate could extend only AbstractCompile")
|
||||||
|
|
||||||
|
if ( !task.hasProperty(propertyName)) return null
|
||||||
|
|
||||||
|
return task.property(propertyName)?.let { klass.cast(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun setValue(task: Any?, property: KProperty<*>, value: T?) {
|
||||||
|
if (task !is AbstractCompile) throw IllegalStateException("TaskPropertyDelegate could extend only AbstractCompile")
|
||||||
|
|
||||||
|
task.setProperty(propertyName, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user