Browse Source

[gradle] Fix resource accessor name escaping. (#4901)

Fixes https://github.com/JetBrains/compose-multiplatform/issues/4548

## Testing
Add compose resources with name such as "package", "is" or "item_$xxx"
and check that app compiles and works fine. Accessors should be properly
escaped

## Release Notes
### Fixes - Resources
- Fix resource accessors escaping. Now it is possible to use resources
with names: "package", "is", "item_$xxx" etc
pull/4909/head v1.6.20-dev1663
Konstantin 6 months ago committed by GitHub
parent
commit
9a513c55e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 8
      gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GeneratedResClassSpec.kt
  2. 4
      gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt
  3. 13
      gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected-open-res/commonMainResourceAccessors/my/lib/res/Drawable0.commonMain.kt
  4. 19
      gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected-open-res/commonMainResourceAccessors/my/lib/res/String0.commonMain.kt
  5. 13
      gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected/commonMainResourceAccessors/app/group/resources_test/generated/resources/Drawable0.commonMain.kt
  6. 19
      gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected/commonMainResourceAccessors/app/group/resources_test/generated/resources/String0.commonMain.kt
  7. 36
      gradle-plugins/compose/src/test/test-projects/misc/commonResources/src/commonMain/composeResources/drawable/is.xml
  8. 1
      gradle-plugins/compose/src/test/test-projects/misc/commonResources/src/commonMain/composeResources/values/strings.xml

8
gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GeneratedResClassSpec.kt

@ -240,7 +240,7 @@ private fun getChunkFileSpec(
typeObject.addModifiers(KModifier.PRIVATE) typeObject.addModifiers(KModifier.PRIVATE)
val properties = idToResources.keys.map { resName -> val properties = idToResources.keys.map { resName ->
PropertySpec.builder(resName, type.getClassName()) PropertySpec.builder(resName, type.getClassName())
.delegate("\nlazy·{ init_$resName() }") .delegate("\nlazy·{ %N() }", "init_$resName")
.build() .build()
} }
typeObject.addProperties(properties) typeObject.addProperties(properties)
@ -250,7 +250,7 @@ private fun getChunkFileSpec(
idToResources.forEach { (resName, items) -> idToResources.forEach { (resName, items) ->
val accessor = PropertySpec.builder(resName, type.getClassName(), resModifier) val accessor = PropertySpec.builder(resName, type.getClassName(), resModifier)
.receiver(ClassName(packageName, "Res", type.accessorName)) .receiver(ClassName(packageName, "Res", type.accessorName))
.getter(FunSpec.getterBuilder().addStatement("return $chunkClassName.$resName").build()) .getter(FunSpec.getterBuilder().addStatement("return $chunkClassName.%N", resName).build())
.build() .build()
chunkFile.addProperty(accessor) chunkFile.addProperty(accessor)
@ -260,8 +260,8 @@ private fun getChunkFileSpec(
.addStatement( .addStatement(
CodeBlock.builder() CodeBlock.builder()
.add("return %T(\n", type.getClassName()).withIndent { .add("return %T(\n", type.getClassName()).withIndent {
add("\"${type}:${resName}\",") add("%S,", "$type:$resName")
if (type.requiresKeyName()) add(" \"$resName\",") if (type.requiresKeyName()) add(" %S,", resName)
withIndent { withIndent {
add("\nsetOf(\n").withIndent { add("\nsetOf(\n").withIndent {
items.forEach { item -> items.forEach { item ->

4
gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt

@ -227,9 +227,7 @@ class ResourcesTest : GradlePluginTestBase() {
@Test @Test
fun testMultiModuleResources() { fun testMultiModuleResources() {
val environment = defaultTestEnvironment.copy( val environment = defaultTestEnvironment.copy(kotlinVersion = "2.0.0")
kotlinVersion = "2.0.0-RC2"
)
with( with(
testProject("misc/kmpResourcePublication", environment) testProject("misc/kmpResourcePublication", environment)
) { ) {

13
gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected-open-res/commonMainResourceAccessors/my/lib/res/Drawable0.commonMain.kt

@ -12,6 +12,9 @@ private object CommonMainDrawable0 {
public val camelCaseName: DrawableResource by public val camelCaseName: DrawableResource by
lazy { init_camelCaseName() } lazy { init_camelCaseName() }
public val `is`: DrawableResource by
lazy { init_is() }
public val vector: DrawableResource by public val vector: DrawableResource by
lazy { init_vector() } lazy { init_vector() }
@ -41,6 +44,16 @@ private fun init_camelCaseName(): DrawableResource =
) )
) )
public val Res.drawable.`is`: DrawableResource
get() = CommonMainDrawable0.`is`
private fun init_is(): DrawableResource = org.jetbrains.compose.resources.DrawableResource(
"drawable:is",
setOf(
org.jetbrains.compose.resources.ResourceItem(setOf(), "drawable/is.xml", -1, -1),
)
)
public val Res.drawable.vector: DrawableResource public val Res.drawable.vector: DrawableResource
get() = CommonMainDrawable0.vector get() = CommonMainDrawable0.vector

19
gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected-open-res/commonMainResourceAccessors/my/lib/res/String0.commonMain.kt

@ -21,6 +21,9 @@ private object CommonMainString0 {
public val hello: StringResource by public val hello: StringResource by
lazy { init_hello() } lazy { init_hello() }
public val `info_using_release_$x`: StringResource by
lazy { `init_info_using_release_$x`() }
public val multi_line: StringResource by public val multi_line: StringResource by
lazy { init_multi_line() } lazy { init_multi_line() }
@ -83,13 +86,25 @@ private fun init_hello(): StringResource = org.jetbrains.compose.resources.Strin
) )
) )
public val Res.string.`info_using_release_$x`: StringResource
get() = CommonMainString0.`info_using_release_$x`
private fun `init_info_using_release_$x`(): StringResource =
org.jetbrains.compose.resources.StringResource(
"string:info_using_release_${'$'}x", "info_using_release_${'$'}x",
setOf(
org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 320,
57),
)
)
public val Res.string.multi_line: StringResource public val Res.string.multi_line: StringResource
get() = CommonMainString0.multi_line get() = CommonMainString0.multi_line
private fun init_multi_line(): StringResource = org.jetbrains.compose.resources.StringResource( private fun init_multi_line(): StringResource = org.jetbrains.compose.resources.StringResource(
"string:multi_line", "multi_line", "string:multi_line", "multi_line",
setOf( setOf(
org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 320, org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 378,
178), 178),
) )
) )
@ -100,7 +115,7 @@ public val Res.string.str_template: StringResource
private fun init_str_template(): StringResource = org.jetbrains.compose.resources.StringResource( private fun init_str_template(): StringResource = org.jetbrains.compose.resources.StringResource(
"string:str_template", "str_template", "string:str_template", "str_template",
setOf( setOf(
org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 499, org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 557,
76), 76),
) )
) )

13
gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected/commonMainResourceAccessors/app/group/resources_test/generated/resources/Drawable0.commonMain.kt

@ -12,6 +12,9 @@ private object CommonMainDrawable0 {
public val camelCaseName: DrawableResource by public val camelCaseName: DrawableResource by
lazy { init_camelCaseName() } lazy { init_camelCaseName() }
public val `is`: DrawableResource by
lazy { init_is() }
public val vector: DrawableResource by public val vector: DrawableResource by
lazy { init_vector() } lazy { init_vector() }
@ -41,6 +44,16 @@ private fun init_camelCaseName(): DrawableResource =
) )
) )
internal val Res.drawable.`is`: DrawableResource
get() = CommonMainDrawable0.`is`
private fun init_is(): DrawableResource = org.jetbrains.compose.resources.DrawableResource(
"drawable:is",
setOf(
org.jetbrains.compose.resources.ResourceItem(setOf(), "drawable/is.xml", -1, -1),
)
)
internal val Res.drawable.vector: DrawableResource internal val Res.drawable.vector: DrawableResource
get() = CommonMainDrawable0.vector get() = CommonMainDrawable0.vector

19
gradle-plugins/compose/src/test/test-projects/misc/commonResources/expected/commonMainResourceAccessors/app/group/resources_test/generated/resources/String0.commonMain.kt

@ -21,6 +21,9 @@ private object CommonMainString0 {
public val hello: StringResource by public val hello: StringResource by
lazy { init_hello() } lazy { init_hello() }
public val `info_using_release_$x`: StringResource by
lazy { `init_info_using_release_$x`() }
public val multi_line: StringResource by public val multi_line: StringResource by
lazy { init_multi_line() } lazy { init_multi_line() }
@ -83,13 +86,25 @@ private fun init_hello(): StringResource = org.jetbrains.compose.resources.Strin
) )
) )
internal val Res.string.`info_using_release_$x`: StringResource
get() = CommonMainString0.`info_using_release_$x`
private fun `init_info_using_release_$x`(): StringResource =
org.jetbrains.compose.resources.StringResource(
"string:info_using_release_${'$'}x", "info_using_release_${'$'}x",
setOf(
org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 320,
57),
)
)
internal val Res.string.multi_line: StringResource internal val Res.string.multi_line: StringResource
get() = CommonMainString0.multi_line get() = CommonMainString0.multi_line
private fun init_multi_line(): StringResource = org.jetbrains.compose.resources.StringResource( private fun init_multi_line(): StringResource = org.jetbrains.compose.resources.StringResource(
"string:multi_line", "multi_line", "string:multi_line", "multi_line",
setOf( setOf(
org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 320, org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 378,
178), 178),
) )
) )
@ -100,7 +115,7 @@ internal val Res.string.str_template: StringResource
private fun init_str_template(): StringResource = org.jetbrains.compose.resources.StringResource( private fun init_str_template(): StringResource = org.jetbrains.compose.resources.StringResource(
"string:str_template", "str_template", "string:str_template", "str_template",
setOf( setOf(
org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 499, org.jetbrains.compose.resources.ResourceItem(setOf(), "values/strings.commonMain.cvr", 557,
76), 76),
) )
) )

36
gradle-plugins/compose/src/test/test-projects/misc/commonResources/src/commonMain/composeResources/drawable/is.xml

@ -0,0 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="600dp"
android:height="600dp"
android:viewportWidth="600"
android:viewportHeight="600">
<path
android:pathData="M301.21,418.53C300.97,418.54 300.73,418.56 300.49,418.56C297.09,418.59 293.74,417.72 290.79,416.05L222.6,377.54C220.63,376.43 219,374.82 217.85,372.88C216.7,370.94 216.09,368.73 216.07,366.47L216.07,288.16C216.06,287.32 216.09,286.49 216.17,285.67C216.38,283.54 216.91,281.5 217.71,279.6L199.29,268.27L177.74,256.19C175.72,260.43 174.73,265.23 174.78,270.22L174.79,387.05C174.85,393.89 178.57,400.2 184.53,403.56L286.26,461.02C290.67,463.51 295.66,464.8 300.73,464.76C300.91,464.76 301.09,464.74 301.27,464.74C301.24,449.84 301.22,439.23 301.22,439.23L301.21,418.53Z"
android:fillColor="#041619"
android:fillType="nonZero"/>
<path
android:pathData="M409.45,242.91L312.64,188.23C303.64,183.15 292.58,183.26 283.68,188.51L187.92,245C183.31,247.73 179.93,251.62 177.75,256.17L177.74,256.19L199.29,268.27L217.71,279.6C217.83,279.32 217.92,279.02 218.05,278.74C218.24,278.36 218.43,277.98 218.64,277.62C219.06,276.88 219.52,276.18 220.04,275.51C221.37,273.8 223.01,272.35 224.87,271.25L289.06,233.39C290.42,232.59 291.87,231.96 293.39,231.51C295.53,230.87 297.77,230.6 300,230.72C302.98,230.88 305.88,231.73 308.47,233.2L373.37,269.85C375.54,271.08 377.49,272.68 379.13,274.57C379.68,275.19 380.18,275.85 380.65,276.53C380.86,276.84 381.05,277.15 381.24,277.47L397.79,266.39L420.34,252.93L420.31,252.88C417.55,248.8 413.77,245.35 409.45,242.91Z"
android:fillColor="#37BF6E"
android:fillType="nonZero"/>
<path
android:pathData="M381.24,277.47C381.51,277.92 381.77,278.38 382.01,278.84C382.21,279.24 382.39,279.65 382.57,280.06C382.91,280.88 383.19,281.73 383.41,282.59C383.74,283.88 383.92,285.21 383.93,286.57L383.93,361.1C383.96,363.95 383.35,366.77 382.16,369.36C381.93,369.86 381.69,370.35 381.42,370.83C379.75,373.79 377.32,376.27 374.39,378L310.2,415.87C307.47,417.48 304.38,418.39 301.21,418.53L301.22,439.23C301.22,439.23 301.24,449.84 301.27,464.74C306.1,464.61 310.91,463.3 315.21,460.75L410.98,404.25C419.88,399 425.31,389.37 425.22,379.03L425.22,267.85C425.17,262.48 423.34,257.34 420.34,252.93L397.79,266.39L381.24,277.47Z"
android:fillColor="#3870B2"
android:fillType="nonZero"/>
<path
android:pathData="M177.75,256.17C179.93,251.62 183.31,247.73 187.92,245L283.68,188.51C292.58,183.26 303.64,183.15 312.64,188.23L409.45,242.91C413.77,245.35 417.55,248.8 420.31,252.88L420.34,252.93L498.59,206.19C494.03,199.46 487.79,193.78 480.67,189.75L320.86,99.49C306.01,91.1 287.75,91.27 273.07,99.95L114.99,193.2C107.39,197.69 101.81,204.11 98.21,211.63L177.74,256.19L177.75,256.17ZM301.27,464.74C301.09,464.74 300.91,464.76 300.73,464.76C295.66,464.8 290.67,463.51 286.26,461.02L184.53,403.56C178.57,400.2 174.85,393.89 174.79,387.05L174.78,270.22C174.73,265.23 175.72,260.43 177.74,256.19L98.21,211.63C94.86,218.63 93.23,226.58 93.31,234.82L93.31,427.67C93.42,438.97 99.54,449.37 109.4,454.92L277.31,549.77C284.6,553.88 292.84,556.01 301.2,555.94L301.2,555.8C301.39,543.78 301.33,495.26 301.27,464.74Z"
android:strokeWidth="10"
android:fillColor="#00000000"
android:strokeColor="#083042"
android:fillType="nonZero"/>
<path
android:pathData="M498.59,206.19L420.34,252.93C423.34,257.34 425.17,262.48 425.22,267.85L425.22,379.03C425.31,389.37 419.88,399 410.98,404.25L315.21,460.75C310.91,463.3 306.1,464.61 301.27,464.74C301.33,495.26 301.39,543.78 301.2,555.8L301.2,555.94C309.48,555.87 317.74,553.68 325.11,549.32L483.18,456.06C497.87,447.39 506.85,431.49 506.69,414.43L506.69,230.91C506.6,222.02 503.57,213.5 498.59,206.19Z"
android:strokeWidth="10"
android:fillColor="#00000000"
android:strokeColor="#083042"
android:fillType="nonZero"/>
<path
android:pathData="M301.2,555.94C292.84,556.01 284.6,553.88 277.31,549.76L109.4,454.92C99.54,449.37 93.42,438.97 93.31,427.67L93.31,234.82C93.23,226.58 94.86,218.63 98.21,211.63C101.81,204.11 107.39,197.69 114.99,193.2L273.07,99.95C287.75,91.27 306.01,91.1 320.86,99.49L480.67,189.75C487.79,193.78 494.03,199.46 498.59,206.19C503.57,213.5 506.6,222.02 506.69,230.91L506.69,414.43C506.85,431.49 497.87,447.39 483.18,456.06L325.11,549.32C317.74,553.68 309.48,555.87 301.2,555.94Z"
android:strokeWidth="10"
android:fillColor="#00000000"
android:strokeColor="#083042"
android:fillType="nonZero"/>
</vector>

1
gradle-plugins/compose/src/test/test-projects/misc/commonResources/src/commonMain/composeResources/values/strings.xml

@ -8,6 +8,7 @@
<string name="PascalCase">PascalCase</string> <string name="PascalCase">PascalCase</string>
<string name="1-kebab-case">1-kebab-case</string> <string name="1-kebab-case">1-kebab-case</string>
<string name="camelCase">camelCase</string> <string name="camelCase">camelCase</string>
<string name="info_using_release_$x">info_using_release_$x</string>
<plurals name="numberOfSongsAvailable"> <plurals name="numberOfSongsAvailable">
<item quantity="zero">%d zero</item> <item quantity="zero">%d zero</item>

Loading…
Cancel
Save