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

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

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 org.gradle.util.DeprecationLogger
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) })
}


fun TaskContainer.removeTask(task: Task) {
    DeprecationLogger.whileDisabled {
        remove(task)
    }
}

fun TaskContainer.removeTasksIf(filter: (task: Task) -> Boolean) {
    filter(filter).forEach { task ->
        removeTask(task)
    }
}

fun  TaskContainer.removeTasksIf(type: Class, filter: (task: T) -> Boolean) {
    filterIsInstance(type).filter(filter).forEach { task ->
        removeTask(task)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy