From 06d55433784743e5fa2b18bdcba53c65feba55ee Mon Sep 17 00:00:00 2001 From: Nikita Lipsky Date: Mon, 1 Sep 2025 13:46:29 +0200 Subject: [PATCH] Provide public API for ResourceContentHash annotation generation (#5402) Provides `generateResourceContentHashAnnotation` property for `generateResourceAccessorsFor*` tasks that defines whether to generate `@ResourceContentHash` annotation for resource accessors. The property can be set the following way: ``` tasks.configureEach { if (this is org.jetbrains.compose.resources.ResourceAccessorsConfiguration) { generateResourceContentHashAnnotation.set(true) } } ``` ## Release Notes ### Features - Multiple Platforms - Provide public API for `@ResourceContentHash` annotation generation --- .../resources/ComposeResourcesGeneration.kt | 6 ----- .../GenerateResourceAccessorsTask.kt | 23 +++++++++++++++++-- .../test/tests/integration/ResourcesTest.kt | 12 +++++++++- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ComposeResourcesGeneration.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ComposeResourcesGeneration.kt index 8f4d71e4ec..996ccf775d 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ComposeResourcesGeneration.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ComposeResourcesGeneration.kt @@ -153,12 +153,6 @@ private fun Project.configureResourceAccessorsGeneration( task.packagingDir.set(packagingDir) } task.onlyIf { shouldGenerateCode.get() } - task.generateResourceContentHashAnnotation.set( - project.providers - .systemProperty("compose.resources.generate.ResourceContentHash.annotation") - .map { it.toBoolean() } - .orElse(false) - ) } //register generated source set diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResourceAccessorsTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResourceAccessorsTask.kt index c2aa17c3c0..f377b6aa7b 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResourceAccessorsTask.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResourceAccessorsTask.kt @@ -14,7 +14,22 @@ import java.io.File import java.nio.file.Path import kotlin.io.path.relativeTo -internal abstract class GenerateResourceAccessorsTask : IdeaImportTask() { +/** + * Configuration for resource accessors generation. + */ +interface ResourceAccessorsConfiguration { + + /** + * Property that defines whether to generate `@ResourceContentHash` annotation for resource accessors. + * + * `@ResourceContentHash` annotation is used to mark resource accessors with the resource content hash. + * It can be used by a client to determine if the resource content is changed or not. + * By default, the annotation is not generated but the client may override it by setting this property to `true`. + */ + val generateResourceContentHashAnnotation: Property +} + +internal abstract class GenerateResourceAccessorsTask : IdeaImportTask(), ResourceAccessorsConfiguration { @get:Input abstract val packageName: Property @@ -32,7 +47,7 @@ internal abstract class GenerateResourceAccessorsTask : IdeaImportTask() { abstract val makeAccessorsPublic: Property @get:Input - abstract val generateResourceContentHashAnnotation: Property + abstract override val generateResourceContentHashAnnotation: Property @get:InputFiles @get:SkipWhenEmpty @@ -42,6 +57,10 @@ internal abstract class GenerateResourceAccessorsTask : IdeaImportTask() { @get:OutputDirectory abstract val codeDir: DirectoryProperty + init { + generateResourceContentHashAnnotation.convention(false) + } + override fun safeAction() { val kotlinDir = codeDir.get().asFile val rootResDir = resDir.get() diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt index 67c2267049..0a2019c237 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt @@ -586,8 +586,18 @@ class ResourcesTest : GradlePluginTestBase() { @Test fun testGeneratedAccessorsAnnotatedWithResourceContentHash(): Unit = with(testProject("misc/commonResources")) { + file("build.gradle.kts").appendText( + """ + tasks.configureEach { + if (this is org.jetbrains.compose.resources.ResourceAccessorsConfiguration) { + generateResourceContentHashAnnotation.set(true) + } + } + """.trimIndent() + ) + //check generated resource's accessors - gradle("prepareKotlinIdeaImport", "-Dcompose.resources.generate.ResourceContentHash.annotation=true").checks { + gradle("prepareKotlinIdeaImport").checks { val expected = if (System.getProperty("os.name").lowercase().contains("windows")) { // Windows has different line endings in comparison with Unixes, // thus the XML resource files differ and produce different content hashes,