Avoid iterating jar inputs in inspectClassesForKotlinIC task

Jar's inputs can contain zipTrees in case of fat jars,
which can cause slow build
(Gradle unpacks them into temporary dir; that can be slow)

    #KT-24956 fixed
This commit is contained in:
Alexey Tsvetkov
2018-06-22 01:34:03 +03:00
parent e38cafb1a2
commit 9071a70a44
2 changed files with 9 additions and 4 deletions
@@ -387,6 +387,7 @@ internal abstract class AbstractKotlinPlugin(
return
}
val inspectTask = project.tasks.create("inspectClassesForKotlinIC", InspectClassesForMultiModuleIC::class.java)
inspectTask.sourceSetName = SourceSet.MAIN_SOURCE_SET_NAME
inspectTask.jarTask = jarTask
inspectTask.dependsOn(classesTask)
jarTask.dependsOn(inspectTask)
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.file.FileCollection
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.*
import org.gradle.jvm.tasks.Jar
import org.jetbrains.kotlin.gradle.utils.inputsCompatible
import org.jetbrains.kotlin.gradle.utils.isClassFile
import java.io.File
@@ -17,6 +17,9 @@ internal open class InspectClassesForMultiModuleIC : DefaultTask() {
@get:Internal
lateinit var jarTask: Jar
@get:Input
lateinit var sourceSetName: String
@Suppress("MemberVisibilityCanBePrivate")
@get:OutputFile
internal val classesListFile: File
@@ -25,7 +28,9 @@ internal open class InspectClassesForMultiModuleIC : DefaultTask() {
@Suppress("MemberVisibilityCanBePrivate")
@get:InputFiles
internal val classFiles: FileCollection
get() = jarTask.inputsCompatible.files.filter { it.isClassFile() }
get() = project.convention.findPlugin(JavaPluginConvention::class.java)?.let {
it.sourceSets.findByName(sourceSetName)?.output?.asFileTree?.filter { it.isClassFile() }
} ?: project.files()
@get:Input
internal val archivePath: String
@@ -34,8 +39,7 @@ internal open class InspectClassesForMultiModuleIC : DefaultTask() {
@TaskAction
fun run() {
classesListFile.parentFile.mkdirs()
val paths = classFiles.map { it.canonicalPath }.sorted()
val text = paths.joinToString(File.pathSeparator)
val text = classFiles.map { it.absolutePath }.sorted().joinToString(File.pathSeparator)
classesListFile.writeText(text)
}