diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResClassTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResClassTask.kt index f8cf6ffc60..9b8c8fd44e 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResClassTask.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResClassTask.kt @@ -73,7 +73,7 @@ abstract class GenerateResClassTask : DefaultTask() { return if (typeString == "values" && file.name.equals("strings.xml", true)) { val stringIds = getStringIds(file) stringIds.map { strId -> - ResourceItem(ResourceType.STRING, qualifiers, strId.lowercase(), path) + ResourceItem(ResourceType.STRING, qualifiers, strId.asUnderscoredIdentifier(), path) } } else { val type = try { @@ -82,7 +82,7 @@ abstract class GenerateResClassTask : DefaultTask() { logger.error("e: Error: $path", e) return null } - listOf(ResourceItem(type, qualifiers, file.nameWithoutExtension.lowercase(), path)) + listOf(ResourceItem(type, qualifiers, file.nameWithoutExtension.asUnderscoredIdentifier(), path)) } } @@ -95,4 +95,9 @@ abstract class GenerateResClassTask : DefaultTask() { .map { it.attributes.getNamedItem("name").nodeValue } return ids.toSet() } -} \ No newline at end of file +} + +internal fun String.asUnderscoredIdentifier(): String = + lowercase() + .replace('-', '_') + .let { if (it.first().isDigit()) "_$it" else it } \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ResourcesGenerator.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ResourcesGenerator.kt index 10331de455..5f8a75bc07 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ResourcesGenerator.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ResourcesGenerator.kt @@ -20,7 +20,7 @@ internal fun Project.configureResourceGenerator() { val packageName = provider { buildString { - val group = project.group.toString() + val group = project.group.toString().asUnderscoredIdentifier() append(group) if (group.isNotEmpty()) append(".") append("generated.resources") 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 2a47875137..590f8306b2 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 @@ -13,7 +13,7 @@ class ResourcesTest : GradlePluginTestBase() { //check generated resource's accessors gradle("generateComposeResClass").checks { assertEqualTextFiles( - file("build/generated/compose/resourceGenerator/kotlin/generated/resources/Res.kt"), + file("build/generated/compose/resourceGenerator/kotlin/app/group/generated/resources/Res.kt"), file("expected/Res.kt") ) check.logContains(""" diff --git a/gradle-plugins/compose/src/test/test-projects/misc/commonResources/build.gradle.kts b/gradle-plugins/compose/src/test/test-projects/misc/commonResources/build.gradle.kts index 622b7a02ed..d650b32dc6 100644 --- a/gradle-plugins/compose/src/test/test-projects/misc/commonResources/build.gradle.kts +++ b/gradle-plugins/compose/src/test/test-projects/misc/commonResources/build.gradle.kts @@ -4,6 +4,8 @@ plugins { id("org.jetbrains.compose") } +group = "app.group" + kotlin { androidTarget { compilations.all { diff --git a/gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected/Res.kt b/gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected/Res.kt index 33411f4ba9..295839906e 100644 --- a/gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected/Res.kt +++ b/gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected/Res.kt @@ -1,4 +1,4 @@ -package generated.resources +package app.group.generated.resources import org.jetbrains.compose.resources.FontResource import org.jetbrains.compose.resources.ImageResource @@ -16,6 +16,13 @@ internal object Res { } public object images { + public val _3_strange_name: ImageResource = ImageResource( + "IMAGE:_3_strange_name", + setOf( + ResourceItem(setOf(), "composeRes/images/3-strange-name.xml"), + ) + ) + public val vector: ImageResource = ImageResource( "IMAGE:vector", setOf( diff --git a/gradle-plugins/compose/src/test/test-projects/misc/commonResources/src/commonMain/resources/composeRes/images/3-strange-name.xml b/gradle-plugins/compose/src/test/test-projects/misc/commonResources/src/commonMain/resources/composeRes/images/3-strange-name.xml new file mode 100644 index 0000000000..d7bf7955f4 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/commonResources/src/commonMain/resources/composeRes/images/3-strange-name.xml @@ -0,0 +1,36 @@ + + + + + + + +