Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 1 commit into from
Jul 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -98,17 +98,21 @@ private fun Project.configureResClassGeneration(
GenerateResClassTask::class.java
) { task ->
task.packageName.set(packageName)
task.shouldGenerateCode.set(shouldGenerateCode)
task.makeAccessorsPublic.set(makeAccessorsPublic)
task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/commonResClass"))

if (generateModulePath) {
task.packagingDir.set(packagingDir)
}
task.onlyIf { shouldGenerateCode.get() }
}

//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(
Expand All @@ -128,18 +132,22 @@ private fun Project.configureResourceAccessorsGeneration(
) { task ->
task.packageName.set(packageName)
task.sourceSetName.set(sourceSet.name)
task.shouldGenerateCode.set(shouldGenerateCode)
task.makeAccessorsPublic.set(makeAccessorsPublic)
task.resDir.set(resourcesDir)
task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceAccessors"))

if (generateModulePath) {
task.packagingDir.set(packagingDir)
}
task.onlyIf { shouldGenerateCode.get() }
}

//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 {
Expand Down Expand Up @@ -219,13 +227,17 @@ private fun Project.configureExpectResourceCollectorsGeneration(
GenerateExpectResourceCollectorsTask::class.java
) { task ->
task.packageName.set(packageName)
task.shouldGenerateCode.set(shouldGenerateCode)
task.makeAccessorsPublic.set(makeAccessorsPublic)
task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceCollectors"))
task.onlyIf { shouldGenerateCode.get() }
}

//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(
Expand Down Expand Up @@ -257,13 +269,17 @@ private fun Project.configureActualResourceCollectorsGeneration(
GenerateActualResourceCollectorsTask::class.java
) { task ->
task.packageName.set(packageName)
task.shouldGenerateCode.set(shouldGenerateCode)
task.makeAccessorsPublic.set(makeAccessorsPublic)
task.useActualModifier.set(useActualModifier)
task.resourceAccessorDirs.from(accessorDirs)
task.codeDir.set(layout.buildDirectory.dir("$RES_GEN_DIR/kotlin/${sourceSet.name}ResourceCollectors"))
task.onlyIf { shouldGenerateCode.get() }
}

//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()
}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@ internal abstract class GenerateResClassTask : IdeaImportTask() {
@get:Optional
abstract val packagingDir: Property<File>

@get:Input
abstract val shouldGenerateCode: Property<Boolean>

@get:Input
abstract val makeAccessorsPublic: Property<Boolean>

Expand All @@ -34,15 +31,11 @@ internal abstract class GenerateResClassTask : IdeaImportTask() {
dir.deleteRecursively()
dir.mkdirs()

if (shouldGenerateCode.get()) {
logger.info("Generate $RES_FILE_NAME.kt")
logger.info("Generate $RES_FILE_NAME.kt")

val pkgName = packageName.get()
val moduleDirectory = packagingDir.getOrNull()?.let { it.invariantSeparatorsPath + "/" } ?: ""
val isPublic = makeAccessorsPublic.get()
getResFileSpec(pkgName, RES_FILE_NAME, moduleDirectory, isPublic).writeTo(dir)
} else {
logger.info("Generation Res class is disabled")
}
val pkgName = packageName.get()
val moduleDirectory = packagingDir.getOrNull()?.let { it.invariantSeparatorsPath + "/" } ?: ""
val isPublic = makeAccessorsPublic.get()
getResFileSpec(pkgName, RES_FILE_NAME, moduleDirectory, isPublic).writeTo(dir)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.SkipWhenEmpty
import org.gradle.api.tasks.TaskAction
import org.jetbrains.compose.internal.IdeaImportTask
import java.io.File
import java.nio.file.Path
Expand All @@ -26,9 +25,6 @@ internal abstract class GenerateResourceAccessorsTask : IdeaImportTask() {
@get:Optional
abstract val packagingDir: Property<File>

@get:Input
abstract val shouldGenerateCode: Property<Boolean>

@get:Input
abstract val makeAccessorsPublic: Property<Boolean>

Expand All @@ -49,37 +45,33 @@ internal abstract class GenerateResourceAccessorsTask : IdeaImportTask() {
kotlinDir.deleteRecursively()
kotlinDir.mkdirs()

if (shouldGenerateCode.get()) {
logger.info("Generate accessors for $rootResDir")
logger.info("Generate accessors for $rootResDir")

//get first level dirs
val dirs = rootResDir.listNotHiddenFiles()
//get first level dirs
val dirs = rootResDir.listNotHiddenFiles()

dirs.forEach { f ->
if (!f.isDirectory) {
error("${f.name} is not directory! Raw files should be placed in '${rootResDir.name}/files' directory.")
}
dirs.forEach { f ->
if (!f.isDirectory) {
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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ internal abstract class GenerateExpectResourceCollectorsTask : IdeaImportTask()
@get:Input
abstract val packageName: Property<String>

@get:Input
abstract val shouldGenerateCode: Property<Boolean>

@get:Input
abstract val makeAccessorsPublic: Property<Boolean>

Expand All @@ -31,24 +28,19 @@ internal abstract class GenerateExpectResourceCollectorsTask : IdeaImportTask()
kotlinDir.deleteRecursively()
kotlinDir.mkdirs()

if (shouldGenerateCode.get()) {
logger.info("Generate expect ResourceCollectors for $kotlinDir")
logger.info("Generate expect ResourceCollectors for $kotlinDir")

val pkgName = packageName.get()
val isPublic = makeAccessorsPublic.get()
val spec = getExpectResourceCollectorsFileSpec(pkgName, "ExpectResourceCollectors", isPublic)
spec.writeTo(kotlinDir)
}
val pkgName = packageName.get()
val isPublic = makeAccessorsPublic.get()
val spec = getExpectResourceCollectorsFileSpec(pkgName, "ExpectResourceCollectors", isPublic)
spec.writeTo(kotlinDir)
}
}

internal abstract class GenerateActualResourceCollectorsTask : IdeaImportTask() {
@get:Input
abstract val packageName: Property<String>

@get:Input
abstract val shouldGenerateCode: Property<Boolean>

@get:Input
abstract val makeAccessorsPublic: Property<Boolean>

Expand All @@ -73,44 +65,39 @@ internal abstract class GenerateActualResourceCollectorsTask : IdeaImportTask()
val inputFiles = inputDirs.flatMap { dir ->
dir.walkTopDown().filter { !it.isHidden && it.isFile && it.extension == "kt" }.toList()
}

if (shouldGenerateCode.get()) {
logger.info("Generate actual ResourceCollectors for $kotlinDir")
val funNames = inputFiles.mapNotNull { inputFile ->
if (inputFile.nameWithoutExtension.contains('.')) {
val (fileName, suffix) = inputFile.nameWithoutExtension.split('.')
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`")
null
} 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`")
logger.info("Generate actual ResourceCollectors for $kotlinDir")
val funNames = inputFiles.mapNotNull { inputFile ->
if (inputFile.nameWithoutExtension.contains('.')) {
val (fileName, suffix) = inputFile.nameWithoutExtension.split('.')
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`")
null
} 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
}
}.groupBy({ it.first }, { it.second })

val pkgName = packageName.get()
val isPublic = makeAccessorsPublic.get()
val useActual = useActualModifier.get()
val spec = getActualResourceCollectorsFileSpec(
pkgName,
"ActualResourceCollectors",
isPublic,
useActual,
funNames
)
spec.writeTo(kotlinDir)
} else {
logger.info("Generation ResourceCollectors for $kotlinDir is disabled")
}
} else {
logger.warn("Unknown file name: `$inputFile`")
null
}
}.groupBy({ it.first }, { it.second })

val pkgName = packageName.get()
val isPublic = makeAccessorsPublic.get()
val useActual = useActualModifier.get()
val spec = getActualResourceCollectorsFileSpec(
pkgName,
"ActualResourceCollectors",
isPublic,
useActual,
funNames
)
spec.writeTo(kotlinDir)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -488,8 +488,7 @@ class ResourcesTest : GradlePluginTestBase() {
)
}
gradle("prepareKotlinIdeaImport").checks {
check.taskSuccessful(":generateComposeResClass")
assertFalse(file("build/generated/compose/resourceGenerator/kotlin/commonResClass/app/group/resources_test/generated/resources/Res.kt").exists())
check.taskSkipped(":generateComposeResClass")
}

modifyText("build.gradle.kts") { str ->
Expand Down Expand Up @@ -571,8 +570,14 @@ class ResourcesTest : GradlePluginTestBase() {
}
""".trimIndent()
)
gradle("generateComposeResClass").checks {
check.logContains("Generation Res class is disabled")
gradle("prepareKotlinIdeaImport").checks {
check.taskSkipped(":generateComposeResClass")
check.taskSkipped(":generateResourceAccessorsForCommonMain")
check.taskSkipped(":generateResourceAccessorsForDesktopMain")
check.taskSkipped(":generateResourceAccessorsForAndroidMain")
check.taskSkipped(":generateExpectResourceCollectorsForCommonMain")
check.taskSkipped(":generateActualResourceCollectorsForDesktopMain")
check.taskSkipped(":generateActualResourceCollectorsForAndroidMain")
}
}

Expand Down
Loading