All Downloads are FREE. Search and download functionalities are using the official Maven repository.

main.name.remal.gradle_plugins.dsl.extensions.org.gradle.api.tasks.TaskContainer.kt Maven / Gradle / Ivy

The newest version!
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 ->
        return declaringClass.findMethod(methodName, *parameterTypes) ?: return@forEach
    }
    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.invokeForInstance(this, name)
}

private val registerStringClassMethod: Method by lazy { findRegisterMethod(String::class.java, Class::class.java) }
fun  TaskContainer.registerCompatible(name: String, type: Class) {
    registerStringClassMethod.invokeForInstance(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.invokeForInstance(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.invokeForInstance(this, name, type, Action { configurer(it) })
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy