Scripts/lom/src/main/kotlin/io/gitlab/jfronny/lom/ext/GradleExt.kt

47 lines
2.5 KiB
Kotlin

package io.gitlab.jfronny.lom.ext
import org.gradle.api.Action
import org.gradle.api.DefaultTask
import org.gradle.api.PolymorphicDomainObjectContainer
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.bundling.Jar
import org.gradle.kotlin.dsl.named
import org.gradle.kotlin.dsl.support.delegates.ProjectDelegate
import org.gradle.language.jvm.tasks.ProcessResources
import kotlin.reflect.KClass
import kotlin.reflect.KProperty
val Project.java: JavaPluginExtension get() = extensions.getByName("java") as JavaPluginExtension
fun Project.java(configure: Action<JavaPluginExtension>) = extensions.configure("java", configure)
val Project.publishing: PublishingExtension get() = extensions.getByName("publishing") as PublishingExtension
fun Project.publishing(configure: Action<PublishingExtension>) = extensions.configure("publishing", configure)
val Project.sourceSets: SourceSetContainer get() = extensions.getByName("sourceSets") as SourceSetContainer
fun Project.sourceSets(configure: Action<SourceSetContainer>) = extensions.configure("sourceSets", configure)
val TaskContainer.assemble: DefaultTask get() = named<DefaultTask>("assemble").get()
val TaskContainer.build: DefaultTask get() = named<DefaultTask>("build").get()
val TaskContainer.jar: Jar get() = named<Jar>("jar").get()
val TaskContainer.sourcesJar: Jar get() = named<Jar>("sourcesJar").get()
val TaskContainer.publish: Task get() = named("publish").get()
fun TaskContainer.processResources(configure: ProcessResources.() -> Unit) = named<ProcessResources>("processResources").configure(configure)
fun <T : Any, C : PolymorphicDomainObjectContainer<T>, U : T> C.registering(type: KClass<U>, action: U.() -> Unit): PDelegate<T, C, U> = PDelegate(this, type.java, action)
class PDelegate<T : Any, C : PolymorphicDomainObjectContainer<T>, U : T>(private val container: C, private val type: Class<U>, private val action: U.() -> Unit) {
operator fun provideDelegate(thisRef: Any?, property: KProperty<*>): SDelegate<U> = SDelegate(container.register(property.name, type, action).get())
}
class SDelegate<T>(private val delegate: T) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): T = delegate
}
fun Project.prop(name: String, default: String? = null): String {
return if (default == null || hasProperty(name)) property(name).toString()
else default
}