fun generate()

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)
    }