in buildSrc/src/main/kotlin/org/jetbrains/compose/reload/build/tasks/GenerateHotReloadEnvironmentGradleExtensionsTask.kt [30:95]
fun generate() {
val properties = parseHotReloadProperties(propertiesFile.asFile.get().toPath())
val sourceCode = """
package org.jetbrains.compose.reload.gradle
import java.nio.file.Path
import kotlin.io.path.Path
import org.gradle.api.Project
import org.gradle.api.provider.Provider
import org.jetbrains.compose.reload.core.HotReloadProperty
import org.jetbrains.compose.reload.core.Os
import org.jetbrains.compose.reload.InternalHotReloadApi
import org.jetbrains.compose.reload.DelicateHotReloadApi
import org.jetbrains.compose.reload.ExperimentalHotReloadApi
{{element}}
""".trimIndent().asTemplateOrThrow().renderOrThrow {
val elementTemplate = """
/**
* See [HotReloadProperty.{{name}}]
* {{documentation}}
*/
{{visibilityAnnotation}} val Project.{{providerName}}: Provider<{{providerType}}> get() {
{{providerStatement}}
}
/**
* See [HotReloadProperty.{{name}}]
* {{documentation}}
*/
{{visibilityAnnotation}}val Project.{{propertyName}}: {{propertyType}} get() {
{{statement}}
}
""".trimIndent().asTemplateOrThrow()
properties.filter { DeclaredHotReloadProperty.Target.Build in it.targets }.forEach { property ->
val propertyName = "composeReload${property.name.capitalized()}"
val providerName = "${propertyName}Provider"
"element"(elementTemplate.renderOrThrow {
"visibilityAnnotation"(property.visibilityAnnotation.let { if (it.isNotBlank()) "$it " else "" })
"name"(property.name)
"propertyName"("composeReload${property.name.capitalized()}")
"providerName"(providerName)
"propertyType"(property.toKotlinType())
"providerType"(property.toKotlinType(nullable = false))
property.documentation?.trim()?.lines()?.forEach { line ->
"documentation"(line)
}
"providerStatement"("""return providers.gradleProperty("${property.key}")""")
"providerStatement"(""" .orElse(providers.systemProperty("${property.key}"))""")
"providerStatement"(""" .orElse(providers.environmentVariable("${property.key}"))""")
if (property.default != null) "providerStatement"(""" .orElse(${property.renderDefault()})""")
"providerStatement"(""" .map { raw -> ${property.convertTypeCode("raw")} }""")
"statement"("return $providerName")
if (property.default != null) "statement"(""" .get()""")
else "statement"(""" .getOrNull()""")
})
}
}
outputSourceFile.get().asFile.also { it.parentFile.mkdirs() }.writeText(sourceCode)
}