diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/extension/FileExtension.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/extension/FileExtension.kt index 726844ca..9f4d78ca 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/extension/FileExtension.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/extension/FileExtension.kt @@ -10,3 +10,10 @@ fun File.projectFile(content: String) { fun String.isAgp9(): Boolean { return this.startsWith("9.") } + +fun String.supportsLintToolchain(): Boolean { + val parts = split('.') + val major = parts.getOrNull(0)?.toIntOrNull() ?: return false + val minor = parts.getOrNull(1)?.toIntOrNull() ?: return false + return major > 9 || (major == 9 && minor >= 5) +} diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt index 71554895..bbc21c96 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt @@ -55,6 +55,7 @@ class CompositeBuildPluginAndroidApp { | sourceCompatibility = JavaVersion.VERSION_${versions.project.jdk} | targetCompatibility = JavaVersion.VERSION_${versions.project.jdk} | } +${lintToolchainDsl(versions)} | } | target.extensions.getByType(JavaPluginExtension::class.java).apply { | toolchain.languageVersion.set(org.gradle.jvm.toolchain.JavaLanguageVersion.of(${versions.project.jdk})) diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt index edc18506..26b6d00f 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt @@ -15,6 +15,7 @@ class CompositeBuildPluginAndroidLib { |import org.gradle.api.plugins.JavaPluginExtension |import org.gradle.kotlin.dsl.configure |import org.gradle.kotlin.dsl.dependencies +${lintToolchainImport(versions)} | |class CompositeBuildPluginAndroidLib : Plugin { | override fun apply(target: Project) { @@ -44,6 +45,7 @@ class CompositeBuildPluginAndroidLib { | sourceCompatibility = JavaVersion.VERSION_${versions.project.jdk} | targetCompatibility = JavaVersion.VERSION_${versions.project.jdk} | } +${lintToolchainDsl(versions)} | buildFeatures { | compose = true | } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/LintToolchainDsl.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/LintToolchainDsl.kt new file mode 100644 index 00000000..6b635962 --- /dev/null +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/LintToolchainDsl.kt @@ -0,0 +1,24 @@ +package io.github.cdsap.projectgenerator.generator.plugins.android + +import io.github.cdsap.projectgenerator.generator.extension.supportsLintToolchain +import io.github.cdsap.projectgenerator.model.Versions + +internal fun lintToolchainImport(versions: Versions): String { + if (!versions.android.agp.supportsLintToolchain()) { + return "" + } + return " |import org.gradle.jvm.toolchain.JavaLanguageVersion\n" +} + +internal fun lintToolchainDsl(versions: Versions): String { + if (!versions.android.agp.supportsLintToolchain()) { + return "" + } + return """ + lint { + toolchain { + languageVersion.set(JavaLanguageVersion.of(${versions.project.jdk})) + } + } + """.trimStart('\n').trimEnd() + "\n" +} diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt index cd1c02e9..0b6b99d0 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt @@ -64,7 +64,7 @@ data class Kotlin( ) data class Android( - val agp: String = "9.4.1", + val agp: String = "9.5.0", val agp9: String = "9.0.0-rc02", val androidxCore: String = "1.19.1", val appcompat: String = "1.8.0", diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLintToolchainTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLintToolchainTest.kt new file mode 100644 index 00000000..d1fbfbba --- /dev/null +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLintToolchainTest.kt @@ -0,0 +1,48 @@ +package io.github.cdsap.projectgenerator.generator.plugins.android + +import io.github.cdsap.projectgenerator.model.Android +import io.github.cdsap.projectgenerator.model.DependencyInjection +import io.github.cdsap.projectgenerator.model.Project +import io.github.cdsap.projectgenerator.model.Versions +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +class CompositeBuildPluginAndroidLintToolchainTest { + + @Test + fun `agp 9_5 app and lib plugins pin lint to the project jdk`() { + val versions = Versions( + project = Project(jdk = "21"), + android = Android(agp = "9.5.0") + ) + + val app = CompositeBuildPluginAndroidApp().get(versions, DependencyInjection.NONE) + val lib = CompositeBuildPluginAndroidLib().get(versions, DependencyInjection.NONE) + + listOf(app, lib).forEach { content -> + assertTrue( + content.contains("languageVersion.set(JavaLanguageVersion.of(21))"), + "Expected lint toolchain to use project JDK 21:\n$content" + ) + assertTrue(content.contains("lint {"), content) + assertTrue(content.contains("toolchain {"), content) + } + } + + @Test + fun `agp 9_4 app and lib plugins do not emit lint toolchain dsl`() { + val versions = Versions( + project = Project(jdk = "21"), + android = Android(agp = "9.4.1") + ) + + val app = CompositeBuildPluginAndroidApp().get(versions, DependencyInjection.NONE) + val lib = CompositeBuildPluginAndroidLib().get(versions, DependencyInjection.NONE) + + listOf(app, lib).forEach { content -> + assertFalse(content.contains("lint {"), content) + assertFalse(content.contains("toolchain {"), content) + } + } +}