Browse Source

[gradle] Disable code generation tasks if they are not needed. (#5091)

Small refactor: instead of the run tasks in a dumb mode just skip them
if the resource accessors generation is disabled.
pull/5095/head
Konstantin 5 months ago committed by GitHub
parent
commit
5da48904e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 32
      gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ComposeResourcesGeneration.kt
  2. 17
      gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResClassTask.kt
  3. 54
      gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResourceAccessorsTask.kt
  4. 87
      gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResourceCollectorsTask.kt
  5. 13
      gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt

32
gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/ComposeResourcesGeneration.kt

@ -98,17 +98,21 @@ private fun Project.configureResClassGeneration(
GenerateResClassTask::class.java GenerateResClassTask::class.java
) { task -> ) { task ->
task.packageName.set(packageName) task.packageName.set(packageName)
task.shouldGenerateCode.set(shouldGenerateCode)
task.makeAccessorsPublic.set(makeAccessorsPublic) task.makeAccessorsPublic.set(makeAccessorsPublic)
task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/commonResClass")) task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/commonResClass"))
if (generateModulePath) { if (generateModulePath) {
task.packagingDir.set(packagingDir) task.packagingDir.set(packagingDir)
} }
task.onlyIf { shouldGenerateCode.get() }
} }
//register generated source set //register generated source set
resClassSourceSet.kotlin.srcDir(genTask.map { it.codeDir }) resClassSourceSet.kotlin.srcDir(
genTask.zip(shouldGenerateCode) { task, flag ->
if (flag) listOf(task.codeDir) else emptyList()
}
)
} }
private fun Project.configureResourceAccessorsGeneration( private fun Project.configureResourceAccessorsGeneration(
@ -128,7 +132,6 @@ private fun Project.configureResourceAccessorsGeneration(
) { task -> ) { task ->
task.packageName.set(packageName) task.packageName.set(packageName)
task.sourceSetName.set(sourceSet.name) task.sourceSetName.set(sourceSet.name)
task.shouldGenerateCode.set(shouldGenerateCode)
task.makeAccessorsPublic.set(makeAccessorsPublic) task.makeAccessorsPublic.set(makeAccessorsPublic)
task.resDir.set(resourcesDir) task.resDir.set(resourcesDir)
task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceAccessors")) task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceAccessors"))
@ -136,10 +139,15 @@ private fun Project.configureResourceAccessorsGeneration(
if (generateModulePath) { if (generateModulePath) {
task.packagingDir.set(packagingDir) task.packagingDir.set(packagingDir)
} }
task.onlyIf { shouldGenerateCode.get() }
} }
//register generated source set //register generated source set
sourceSet.kotlin.srcDir(genTask.map { it.codeDir }) sourceSet.kotlin.srcDir(
genTask.zip(shouldGenerateCode) { task, flag ->
if (flag) listOf(task.codeDir) else emptyList()
}
)
} }
private fun KotlinSourceSet.getResourceAccessorsGenerationTaskName(): String { private fun KotlinSourceSet.getResourceAccessorsGenerationTaskName(): String {
@ -219,13 +227,17 @@ private fun Project.configureExpectResourceCollectorsGeneration(
GenerateExpectResourceCollectorsTask::class.java GenerateExpectResourceCollectorsTask::class.java
) { task -> ) { task ->
task.packageName.set(packageName) task.packageName.set(packageName)
task.shouldGenerateCode.set(shouldGenerateCode)
task.makeAccessorsPublic.set(makeAccessorsPublic) task.makeAccessorsPublic.set(makeAccessorsPublic)
task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceCollectors")) task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceCollectors"))
task.onlyIf { shouldGenerateCode.get() }
} }
//register generated source set //register generated source set
sourceSet.kotlin.srcDir(genTask.map { it.codeDir }) sourceSet.kotlin.srcDir(
genTask.zip(shouldGenerateCode) { task, flag ->
if (flag) listOf(task.codeDir) else emptyList()
}
)
} }
private fun Project.configureActualResourceCollectorsGeneration( private fun Project.configureActualResourceCollectorsGeneration(
@ -257,13 +269,17 @@ private fun Project.configureActualResourceCollectorsGeneration(
GenerateActualResourceCollectorsTask::class.java GenerateActualResourceCollectorsTask::class.java
) { task -> ) { task ->
task.packageName.set(packageName) task.packageName.set(packageName)
task.shouldGenerateCode.set(shouldGenerateCode)
task.makeAccessorsPublic.set(makeAccessorsPublic) task.makeAccessorsPublic.set(makeAccessorsPublic)
task.useActualModifier.set(useActualModifier) task.useActualModifier.set(useActualModifier)
task.resourceAccessorDirs.from(accessorDirs) task.resourceAccessorDirs.from(accessorDirs)
task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceCollectors")) task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceCollectors"))
task.onlyIf { shouldGenerateCode.get() }
} }
//register generated source set //register generated source set
sourceSet.kotlin.srcDir(genTask.map { it.codeDir }) sourceSet.kotlin.srcDir(
genTask.zip(shouldGenerateCode) { task, flag ->
if (flag) listOf(task.codeDir) else emptyList()
}
)
} }

17
gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResClassTask.kt

@ -20,9 +20,6 @@ internal abstract class GenerateResClassTask : IdeaImportTask() {
@get:Optional @get:Optional
abstract val packagingDir: Property<File> abstract val packagingDir: Property<File>
@get:Input
abstract val shouldGenerateCode: Property<Boolean>
@get:Input @get:Input
abstract val makeAccessorsPublic: Property<Boolean> abstract val makeAccessorsPublic: Property<Boolean>
@ -34,15 +31,11 @@ internal abstract class GenerateResClassTask : IdeaImportTask() {
dir.deleteRecursively() dir.deleteRecursively()
dir.mkdirs() dir.mkdirs()
if (shouldGenerateCode.get()) { logger.info("Generate $RES_FILE_NAME.kt")
logger.info("Generate $RES_FILE_NAME.kt")
val pkgName = packageName.get() val pkgName = packageName.get()
val moduleDirectory = packagingDir.getOrNull()?.let { it.invariantSeparatorsPath + "/" } ?: "" val moduleDirectory = packagingDir.getOrNull()?.let { it.invariantSeparatorsPath + "/" } ?: ""
val isPublic = makeAccessorsPublic.get() val isPublic = makeAccessorsPublic.get()
getResFileSpec(pkgName, RES_FILE_NAME, moduleDirectory, isPublic).writeTo(dir) getResFileSpec(pkgName, RES_FILE_NAME, moduleDirectory, isPublic).writeTo(dir)
} else {
logger.info("Generation Res class is disabled")
}
} }
} }

54
gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResourceAccessorsTask.kt

@ -9,7 +9,6 @@ import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.SkipWhenEmpty import org.gradle.api.tasks.SkipWhenEmpty
import org.gradle.api.tasks.TaskAction
import org.jetbrains.compose.internal.IdeaImportTask import org.jetbrains.compose.internal.IdeaImportTask
import java.io.File import java.io.File
import java.nio.file.Path import java.nio.file.Path
@ -26,9 +25,6 @@ internal abstract class GenerateResourceAccessorsTask : IdeaImportTask() {
@get:Optional @get:Optional
abstract val packagingDir: Property<File> abstract val packagingDir: Property<File>
@get:Input
abstract val shouldGenerateCode: Property<Boolean>
@get:Input @get:Input
abstract val makeAccessorsPublic: Property<Boolean> abstract val makeAccessorsPublic: Property<Boolean>
@ -49,37 +45,33 @@ internal abstract class GenerateResourceAccessorsTask : IdeaImportTask() {
kotlinDir.deleteRecursively() kotlinDir.deleteRecursively()
kotlinDir.mkdirs() kotlinDir.mkdirs()
if (shouldGenerateCode.get()) { logger.info("Generate accessors for $rootResDir")
logger.info("Generate accessors for $rootResDir")
//get first level dirs //get first level dirs
val dirs = rootResDir.listNotHiddenFiles() val dirs = rootResDir.listNotHiddenFiles()
dirs.forEach { f -> dirs.forEach { f ->
if (!f.isDirectory) { if (!f.isDirectory) {
error("${f.name} is not directory! Raw files should be placed in '${rootResDir.name}/files' directory.") error("${f.name} is not directory! Raw files should be placed in '${rootResDir.name}/files' directory.")
}
} }
//type -> id -> resource item
val resources: Map<ResourceType, Map<String, List<ResourceItem>>> = dirs
.flatMap { dir ->
dir.listNotHiddenFiles()
.mapNotNull { it.fileToResourceItems(rootResDir.toPath()) }
.flatten()
}
.groupBy { it.type }
.mapValues { (_, items) -> items.groupBy { it.name } }
val pkgName = packageName.get()
val moduleDirectory = packagingDir.getOrNull()?.let { it.invariantSeparatorsPath + "/" } ?: ""
val isPublic = makeAccessorsPublic.get()
getAccessorsSpecs(
resources, pkgName, sourceSet, moduleDirectory, isPublic
).forEach { it.writeTo(kotlinDir) }
} else {
logger.info("Generation accessors for $rootResDir is disabled")
} }
//type -> id -> resource item
val resources: Map<ResourceType, Map<String, List<ResourceItem>>> = dirs
.flatMap { dir ->
dir.listNotHiddenFiles()
.mapNotNull { it.fileToResourceItems(rootResDir.toPath()) }
.flatten()
}
.groupBy { it.type }
.mapValues { (_, items) -> items.groupBy { it.name } }
val pkgName = packageName.get()
val moduleDirectory = packagingDir.getOrNull()?.let { it.invariantSeparatorsPath + "/" } ?: ""
val isPublic = makeAccessorsPublic.get()
getAccessorsSpecs(
resources, pkgName, sourceSet, moduleDirectory, isPublic
).forEach { it.writeTo(kotlinDir) }
} }
private fun File.fileToResourceItems( private fun File.fileToResourceItems(

87
gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/resources/GenerateResourceCollectorsTask.kt

@ -15,9 +15,6 @@ internal abstract class GenerateExpectResourceCollectorsTask : IdeaImportTask()
@get:Input @get:Input
abstract val packageName: Property<String> abstract val packageName: Property<String>
@get:Input
abstract val shouldGenerateCode: Property<Boolean>
@get:Input @get:Input
abstract val makeAccessorsPublic: Property<Boolean> abstract val makeAccessorsPublic: Property<Boolean>
@ -31,14 +28,12 @@ internal abstract class GenerateExpectResourceCollectorsTask : IdeaImportTask()
kotlinDir.deleteRecursively() kotlinDir.deleteRecursively()
kotlinDir.mkdirs() kotlinDir.mkdirs()
if (shouldGenerateCode.get()) { logger.info("Generate expect ResourceCollectors for $kotlinDir")
logger.info("Generate expect ResourceCollectors for $kotlinDir")
val pkgName = packageName.get() val pkgName = packageName.get()
val isPublic = makeAccessorsPublic.get() val isPublic = makeAccessorsPublic.get()
val spec = getExpectResourceCollectorsFileSpec(pkgName, "ExpectResourceCollectors", isPublic) val spec = getExpectResourceCollectorsFileSpec(pkgName, "ExpectResourceCollectors", isPublic)
spec.writeTo(kotlinDir) spec.writeTo(kotlinDir)
}
} }
} }
@ -46,9 +41,6 @@ internal abstract class GenerateActualResourceCollectorsTask : IdeaImportTask()
@get:Input @get:Input
abstract val packageName: Property<String> abstract val packageName: Property<String>
@get:Input
abstract val shouldGenerateCode: Property<Boolean>
@get:Input @get:Input
abstract val makeAccessorsPublic: Property<Boolean> abstract val makeAccessorsPublic: Property<Boolean>
@ -73,44 +65,39 @@ internal abstract class GenerateActualResourceCollectorsTask : IdeaImportTask()
val inputFiles = inputDirs.flatMap { dir -> val inputFiles = inputDirs.flatMap { dir ->
dir.walkTopDown().filter { !it.isHidden && it.isFile && it.extension == "kt" }.toList() dir.walkTopDown().filter { !it.isHidden && it.isFile && it.extension == "kt" }.toList()
} }
logger.info("Generate actual ResourceCollectors for $kotlinDir")
if (shouldGenerateCode.get()) { val funNames = inputFiles.mapNotNull { inputFile ->
logger.info("Generate actual ResourceCollectors for $kotlinDir") if (inputFile.nameWithoutExtension.contains('.')) {
val funNames = inputFiles.mapNotNull { inputFile -> val (fileName, suffix) = inputFile.nameWithoutExtension.split('.')
if (inputFile.nameWithoutExtension.contains('.')) { val type = ResourceType.values().firstOrNull { fileName.startsWith(it.accessorName, true) }
val (fileName, suffix) = inputFile.nameWithoutExtension.split('.') val name = "_collect${suffix.uppercaseFirstChar()}${fileName}Resources"
val type = ResourceType.values().firstOrNull { fileName.startsWith(it.accessorName, true) }
val name = "_collect${suffix.uppercaseFirstChar()}${fileName}Resources" if (type == null) {
logger.warn("Unknown resources type: `$inputFile`")
if (type == null) { null
logger.warn("Unknown resources type: `$inputFile`") } else if (!inputFile.readText().contains(name)) {
null logger.warn("A function '$name' is not found in the `$inputFile` file!")
} else if (!inputFile.readText().contains(name)) {
logger.warn("A function '$name' is not found in the `$inputFile` file!")
null
} else {
logger.info("Found collector function: `$name`")
type to name
}
} else {
logger.warn("Unknown file name: `$inputFile`")
null null
} else {
logger.info("Found collector function: `$name`")
type to name
} }
}.groupBy({ it.first }, { it.second }) } else {
logger.warn("Unknown file name: `$inputFile`")
val pkgName = packageName.get() null
val isPublic = makeAccessorsPublic.get() }
val useActual = useActualModifier.get() }.groupBy({ it.first }, { it.second })
val spec = getActualResourceCollectorsFileSpec(
pkgName, val pkgName = packageName.get()
"ActualResourceCollectors", val isPublic = makeAccessorsPublic.get()
isPublic, val useActual = useActualModifier.get()
useActual, val spec = getActualResourceCollectorsFileSpec(
funNames pkgName,
) "ActualResourceCollectors",
spec.writeTo(kotlinDir) isPublic,
} else { useActual,
logger.info("Generation ResourceCollectors for $kotlinDir is disabled") funNames
} )
spec.writeTo(kotlinDir)
} }
} }

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

@ -488,8 +488,7 @@ class ResourcesTest : GradlePluginTestBase() {
) )
} }
gradle("prepareKotlinIdeaImport").checks { gradle("prepareKotlinIdeaImport").checks {
check.taskSuccessful(":generateComposeResClass") check.taskSkipped(":generateComposeResClass")
assertFalse(file("build/generated/compose/resourceGenerator/kotlin/commonResClass/app/group/resources_test/generated/resources/Res.kt").exists())
} }
modifyText("build.gradle.kts") { str -> modifyText("build.gradle.kts") { str ->
@ -571,8 +570,14 @@ class ResourcesTest : GradlePluginTestBase() {
} }
""".trimIndent() """.trimIndent()
) )
gradle("generateComposeResClass").checks { gradle("prepareKotlinIdeaImport").checks {
check.logContains("Generation Res class is disabled") check.taskSkipped(":generateComposeResClass")
check.taskSkipped(":generateResourceAccessorsForCommonMain")
check.taskSkipped(":generateResourceAccessorsForDesktopMain")
check.taskSkipped(":generateResourceAccessorsForAndroidMain")
check.taskSkipped(":generateExpectResourceCollectorsForCommonMain")
check.taskSkipped(":generateActualResourceCollectorsForDesktopMain")
check.taskSkipped(":generateActualResourceCollectorsForAndroidMain")
} }
} }

Loading…
Cancel
Save