From 685f56e1798b8eb300f92abcbc972ace6f1dc477 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 25 Jun 2019 19:58:10 +0300 Subject: [PATCH] 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 --- .../android/internal/AndroidSubplugin.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt index c5c248971e7..ca6ae31ffd6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt @@ -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 { private data class VariantComponentNames(val variantName: String, val flavorName: String, val buildTypeName: String) - private fun getCommonResDirectories(project: Project, resDirectories: List): FileCollection = - if (resDirectories.isEmpty()) - project.files() - else - resDirectories.reduce { acc, other -> acc.filter { other.contains(it) } } + private fun getCommonResDirectories(project: Project, resDirectories: List): FileCollection { + val lazyFiles = lazy { + if (resDirectories.isEmpty()) { + emptySet() + } 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