name.remal.gradle_plugins.dsl.extensions.org.gradle.api.tasks.TaskContainer.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gradle-plugins-kotlin-dsl Show documentation
Show all versions of gradle-plugins-kotlin-dsl Show documentation
Remal Gradle plugins: gradle-plugins-kotlin-dsl
package name.remal.gradle_plugins.dsl.extensions
import name.remal.findMethod
import org.gradle.api.Action
import org.gradle.api.Task
import org.gradle.api.tasks.TaskContainer
import java.lang.reflect.Method
private val registerMethodNames = listOf("register", "createLater", "create")
private fun findRegisterMethod(vararg parameterTypes: Class<*>): Method {
val declaringClass = TaskContainer::class.java
registerMethodNames.forEach { methodName ->
val method = declaringClass.findMethod(methodName, *parameterTypes) ?: return@forEach
method.isAccessible = true
return method
}
throw IllegalStateException("${declaringClass.name} doesn't have a public method of name ${registerMethodNames.joinToString("/")} and parameter types ${parameterTypes.joinToString(", ", transform = { it.name })}")
}
private val registerStringMethod: Method by lazy { findRegisterMethod(String::class.java) }
fun TaskContainer.registerCompatible(name: String) {
registerStringMethod.invoke(this, name)
}
private val registerStringClassMethod: Method by lazy { findRegisterMethod(String::class.java, Class::class.java) }
fun TaskContainer.registerCompatible(name: String, type: Class) {
registerStringClassMethod.invoke(this, name, type)
}
private val registerStringActionMethod: Method by lazy { findRegisterMethod(String::class.java, Action::class.java) }
fun TaskContainer.registerCompatible(name: String, configurer: (task: Task) -> Unit) {
registerStringActionMethod.invoke(this, name, Action { configurer(it) })
}
private val registerStringClassActionMethod: Method by lazy { findRegisterMethod(String::class.java, Class::class.java, Action::class.java) }
fun TaskContainer.registerCompatible(name: String, type: Class, configurer: (task: T) -> Unit) {
registerStringClassActionMethod.invoke(this, name, type, Action { configurer(it) })
}