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
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user