KT-30322 Memory leak in CompilationSourceSetUtil (#2158)

Issue #KT-30322 Fixed
This commit is contained in:
Pavel Nikitin
2019-03-07 10:57:48 +01:00
committed by Sergey Igushkin
parent b3cbd7d5bd
commit a6b7aa3257
@@ -6,25 +6,23 @@
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import groovy.lang.Closure import groovy.lang.Closure
import org.gradle.api.Action
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.tasks.SourceSet
import org.gradle.util.ConfigureUtil import org.gradle.util.ConfigureUtil
import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinCompile import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.sources.defaultSourceSetLanguageSettingsChecker import org.jetbrains.kotlin.gradle.plugin.sources.defaultSourceSetLanguageSettingsChecker
import org.jetbrains.kotlin.gradle.plugin.sources.getSourceSetHierarchy import org.jetbrains.kotlin.gradle.plugin.sources.getSourceSetHierarchy
import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File
import java.util.* import java.util.*
import java.util.concurrent.Callable import java.util.concurrent.Callable
import kotlin.collections.HashSet
internal fun KotlinCompilation<*>.composeName(prefix: String? = null, suffix: String? = null): String { internal fun KotlinCompilation<*>.composeName(prefix: String? = null, suffix: String? = null): String {
val compilationNamePart = compilationName.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME } val compilationNamePart = compilationName.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }
@@ -108,7 +106,7 @@ abstract class AbstractKotlinCompilation<T : KotlinCommonOptions>(
target.project.whenEvaluated { target.project.whenEvaluated {
sourceSet.getSourceSetHierarchy().forEach { sourceSet -> sourceSet.getSourceSetHierarchy().forEach { sourceSet ->
val isCommonSource = val isCommonSource =
CompilationSourceSetUtil.sourceSetsInMultipleCompilations(project)?.contains(sourceSet) ?: false CompilationSourceSetUtil.sourceSetsInMultipleCompilations(project)?.contains(sourceSet.name) ?: false
addSourcesToCompileTask(sourceSet, addAsCommonSources = isCommonSource) addSourcesToCompileTask(sourceSet, addAsCommonSources = isCommonSource)
@@ -203,7 +201,7 @@ internal fun KotlinCompilation<*>.disambiguateName(simpleName: String): String {
private object CompilationSourceSetUtil { private object CompilationSourceSetUtil {
// Cache the results per project // Cache the results per project
private val projectSourceSetsInMultipleCompilationsCache = WeakHashMap<Project, Set<KotlinSourceSet>>() private val projectSourceSetsInMultipleCompilationsCache = WeakHashMap<Project, Set<String>>()
fun sourceSetsInMultipleCompilations(project: Project) = fun sourceSetsInMultipleCompilations(project: Project) =
projectSourceSetsInMultipleCompilationsCache.computeIfAbsent(project) { _ -> projectSourceSetsInMultipleCompilationsCache.computeIfAbsent(project) { _ ->
@@ -212,11 +210,17 @@ private object CompilationSourceSetUtil {
val compilations = (project.kotlinExtension as? KotlinMultiplatformExtension)?.targets?.flatMap { it.compilations } val compilations = (project.kotlinExtension as? KotlinMultiplatformExtension)?.targets?.flatMap { it.compilations }
?: return@computeIfAbsent null ?: return@computeIfAbsent null
compilations val sources = compilations
.flatMap { compilation -> compilation.allKotlinSourceSets.map { sourceSet -> compilation to sourceSet } } .flatMap { compilation -> compilation.allKotlinSourceSets.map { sourceSet -> compilation to sourceSet } }
.groupingBy { (_, sourceSet) -> sourceSet } .groupingBy { (_, sourceSet) -> sourceSet }
.eachCount() .eachCount()
.filterValues { it > 1 }
.keys HashSet<String>().apply {
for (entry in sources) {
if (entry.value > 1) {
add(entry.key.name)
}
}
}
} }
} }