diff --git a/.github/workflows/gradle-plugin.yml b/.github/workflows/gradle-plugin.yml index 93bd079b96..8c7dfe2632 100644 --- a/.github/workflows/gradle-plugin.yml +++ b/.github/workflows/gradle-plugin.yml @@ -31,6 +31,12 @@ jobs: cd gradle-plugins ./gradlew assemble ./gradlew --continue :preview-rpc:test :compose:test :compose:testGradle-${{ matrix.gradle }} + - name: Upload Reports + uses: actions/upload-artifact@v2 + with: + name: Test-Reports + path: gradle-plugins/compose/build/reports + if: always() - name: Print summary shell: bash if: always() 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 27652ebe17..f516bd9d24 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 @@ -2,10 +2,12 @@ package org.jetbrains.compose.resources import org.gradle.api.Project import org.gradle.api.provider.Provider +import org.gradle.api.tasks.SourceSet import org.jetbrains.compose.ComposePlugin import org.jetbrains.compose.desktop.application.internal.ComposeProperties +import org.jetbrains.compose.internal.KOTLIN_JVM_PLUGIN_ID import org.jetbrains.compose.internal.KOTLIN_MPP_PLUGIN_ID -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import java.io.File @@ -18,14 +20,21 @@ private val androidPluginIds = listOf( internal fun Project.configureComposeResources() { plugins.withId(KOTLIN_MPP_PLUGIN_ID) { - val kotlinExtension = project.extensions.getByType(KotlinMultiplatformExtension::class.java) - kotlinExtension.sourceSets.all { sourceSet -> - val sourceSetName = sourceSet.name - val composeResourcesPath = project.projectDir.resolve("src/$sourceSetName/$COMPOSE_RESOURCES_DIR") - sourceSet.resources.srcDirs(composeResourcesPath) - if (sourceSetName == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) { - configureResourceGenerator(composeResourcesPath, sourceSet) - } + configureComposeResources(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) + } + plugins.withId(KOTLIN_JVM_PLUGIN_ID) { + configureComposeResources(SourceSet.MAIN_SOURCE_SET_NAME) + } +} + +private fun Project.configureComposeResources(commonSourceSetName: String) { + val kotlinExtension = project.extensions.getByType(KotlinProjectExtension::class.java) + kotlinExtension.sourceSets.all { sourceSet -> + val sourceSetName = sourceSet.name + val composeResourcesPath = project.projectDir.resolve("src/$sourceSetName/$COMPOSE_RESOURCES_DIR") + sourceSet.resources.srcDirs(composeResourcesPath) + if (sourceSetName == commonSourceSetName) { + configureResourceGenerator(composeResourcesPath, sourceSet) } } } 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 a3f72fee25..e9ce9be344 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 @@ -126,4 +126,15 @@ class ResourcesTest : GradlePluginTestBase() { ) } } + + @Test + fun testJvmOnlyProject(): Unit = with(testProject("misc/jvmOnlyResources")) { + gradle("generateComposeResClass").checks { + assertEqualTextFiles( + file("build/generated/compose/resourceGenerator/kotlin/me/app/jvmonlyresources/generated/resources/Res.kt"), + file("expected/Res.kt") + ) + } + gradle("jar") + } } \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/build.gradle.kts b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/build.gradle.kts new file mode 100644 index 0000000000..269826d575 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("org.jetbrains.compose") + kotlin("jvm") +} + +group = "me.app" + +dependencies { + implementation(compose.desktop.currentOs) + implementation(compose.components.resources) +} + diff --git a/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/expected/Res.kt b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/expected/Res.kt new file mode 100644 index 0000000000..fda4811df5 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/expected/Res.kt @@ -0,0 +1,35 @@ +package me.app.jvmonlyresources.generated.resources + +import kotlin.ByteArray +import kotlin.OptIn +import kotlin.String +import org.jetbrains.compose.resources.DrawableResource +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.ResourceItem +import org.jetbrains.compose.resources.readResourceBytes + +@OptIn(org.jetbrains.compose.resources.InternalResourceApi::class) +@ExperimentalResourceApi +internal object Res { + /** + * Reads the content of the resource file at the specified path and returns it as a byte array. + * + * Example: `val bytes = Res.readBytes("files/key.bin")` + * + * @param path The path of the file to read in the compose resource's directory. + * @return The content of the file as a byte array. + */ + public suspend fun readBytes(path: String): ByteArray = readResourceBytes(path) + + public object drawable { + public val vector: DrawableResource = DrawableResource( + "drawable:vector", + setOf( + ResourceItem( + setOf(), + "drawable/vector.xml" + ), + ) + ) + } +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/gradle.properties b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/gradle.properties new file mode 100644 index 0000000000..c13202c0d5 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx8096M \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/settings.gradle.kts b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/settings.gradle.kts new file mode 100644 index 0000000000..db2097cc90 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/settings.gradle.kts @@ -0,0 +1,22 @@ +rootProject.name = "jvmOnlyResources" +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + google() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + } + plugins { + id("org.jetbrains.kotlin.jvm").version("KOTLIN_VERSION_PLACEHOLDER") + id("org.jetbrains.compose").version("COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER") + } +} +dependencyResolutionManagement { + repositories { + mavenLocal() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + mavenCentral() + gradlePluginPortal() + google() + } +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/src/main/composeResources/drawable/vector.xml b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/src/main/composeResources/drawable/vector.xml new file mode 100644 index 0000000000..d7bf7955f4 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/src/main/composeResources/drawable/vector.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/src/main/kotlin/App.kt b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/src/main/kotlin/App.kt new file mode 100644 index 0000000000..c90b9053e5 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/jvmOnlyResources/src/main/kotlin/App.kt @@ -0,0 +1,13 @@ +import androidx.compose.foundation.Image +import androidx.compose.runtime.Composable +import me.app.jvmonlyresources.generated.resources.Res +import org.jetbrains.compose.resources.* + +@OptIn(ExperimentalResourceApi::class) +@Composable +fun App() { + Image( + painter = painterResource(Res.drawable.vector), + contentDescription = null + ) +}