Fix slow AndroidSubPlugin#getCommonResDirectories, KT-29538

Replace a functionally-built file collection that filters files against
multiple original file collections upon each evaluation with a
lazy file sets intersection that is evaluated only once.

Issue #KT-29538 Fixed
This commit is contained in:
Sergey Igushkin
2019-06-25 19:58:10 +03:00
parent 991c87b9c2
commit 685f56e179
@@ -18,10 +18,10 @@ import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.model.builder.KotlinAndroidExtensionModelBuilder
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.w3c.dom.Document
import java.io.File
@@ -242,11 +242,18 @@ class AndroidSubplugin : KotlinGradleSubplugin<KotlinCompile> {
private data class VariantComponentNames(val variantName: String, val flavorName: String, val buildTypeName: String)
private fun getCommonResDirectories(project: Project, resDirectories: List<FileCollection>): FileCollection =
if (resDirectories.isEmpty())
project.files()
else
resDirectories.reduce { acc, other -> acc.filter { other.contains(it) } }
private fun getCommonResDirectories(project: Project, resDirectories: List<FileCollection>): FileCollection {
val lazyFiles = lazy {
if (resDirectories.isEmpty()) {
emptySet<File>()
} else {
resDirectories.first().toMutableSet().apply {
resDirectories.drop(1).forEach { retainAll(it) }
}
}
}
return project.files(Callable { lazyFiles.value })
}
private fun getApplicationPackage(project: Project, mainSourceSet: AndroidSourceSet): String {
val manifestFile = mainSourceSet.manifest.srcFile