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