package dev.meloda.fast import com.android.build.api.dsl.ApplicationExtension import com.android.build.api.dsl.CommonExtension import com.android.build.api.dsl.CompileOptions import com.android.build.api.dsl.LibraryExtension import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.plugins.JavaPluginExtension import org.gradle.kotlin.dsl.assign import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.provideDelegate import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinBaseExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension internal fun Project.configureKotlinAndroid( commonExtension: CommonExtension, ) { when (commonExtension) { is ApplicationExtension -> commonExtension.compileOptions(buildCompileOptions()) is LibraryExtension -> commonExtension.compileOptions(buildCompileOptions()) } commonExtension.apply { compileSdk = getVersionInt("compileSdk") buildToolsVersion = "36.1.0" } configureKotlin() } private fun buildCompileOptions(): CompileOptions.() -> Unit = { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } internal fun Project.configureKotlinJvm() { extensions.configure { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } configureKotlin() } private inline fun Project.configureKotlin() = configure { // Treat all Kotlin warnings as errors (disabled by default) // Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties val warningsAsErrors: String? by project when (this) { is KotlinAndroidProjectExtension -> compilerOptions is KotlinJvmProjectExtension -> compilerOptions else -> throw IllegalArgumentException("Unsupported project extension $this ${T::class}") }.apply { jvmTarget = JvmTarget.JVM_21 allWarningsAsErrors = warningsAsErrors.toBoolean() freeCompilerArgs.addAll( "-opt-in=kotlin.RequiresOptIn", // Enable experimental coroutines APIs, including Flow "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", "-opt-in=kotlinx.coroutines.FlowPreview", "-Xannotation-default-target=param-property", "-Xcontext-parameters" ) } }