Optimize memory usage during import of MPP projects

#KT-30767 Fixed
This commit is contained in:
Andrey Uskov
2019-04-02 10:40:46 +03:00
parent 3ca1c7b55d
commit 792fae4afc
4 changed files with 61 additions and 20 deletions
@@ -9,10 +9,20 @@ import org.jetbrains.plugins.gradle.model.ExternalDependency
import org.jetbrains.plugins.gradle.model.ModelFactory
import java.io.File
import java.io.Serializable
import java.util.*
typealias KotlinDependency = ExternalDependency
fun KotlinDependency.deepCopy(): KotlinDependency = ModelFactory.createCopy(this)
fun KotlinDependency.deepCopy(cache: MutableMap<Any, Any>): KotlinDependency {
val cachedValue = cache[this] as? KotlinDependency
if (cachedValue != null) {
return cachedValue
} else {
val result = ModelFactory.createCopy(this)
cache[this] = result
return result
}
}
interface KotlinModule : Serializable {
val name: String
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle
import java.io.File
import java.util.*
data class KotlinSourceSetImpl(
override val name: String,
@@ -18,12 +19,12 @@ data class KotlinSourceSetImpl(
val defaultIsTestModule: Boolean = false
) : KotlinSourceSet {
constructor(kotlinSourceSet: KotlinSourceSet) : this(
constructor(kotlinSourceSet: KotlinSourceSet, cloningCache: MutableMap<Any, Any>) : this(
kotlinSourceSet.name,
KotlinLanguageSettingsImpl(kotlinSourceSet.languageSettings),
HashSet(kotlinSourceSet.sourceDirs),
HashSet(kotlinSourceSet.resourceDirs),
kotlinSourceSet.dependencies.map { it.deepCopy() }.toSet(),
kotlinSourceSet.dependencies.map { it.deepCopy(cloningCache) }.toSet(),
HashSet(kotlinSourceSet.dependsOnSourceSets),
kotlinSourceSet.platform,
kotlinSourceSet.isTestModule
@@ -87,10 +88,14 @@ data class KotlinCompilationImpl(
) : KotlinCompilation {
// create deep copy
constructor(kotlinCompilation: KotlinCompilation) : this(
constructor(kotlinCompilation: KotlinCompilation, cloningCache: MutableMap<Any, Any>) : this(
kotlinCompilation.name,
kotlinCompilation.sourceSets.map { KotlinSourceSetImpl(it) }.toList(),
kotlinCompilation.dependencies.map { it.deepCopy() }.toSet(),
kotlinCompilation.sourceSets.map { initialSourceSet ->
(cloningCache[initialSourceSet] as? KotlinSourceSet) ?: KotlinSourceSetImpl(initialSourceSet, cloningCache).also {
cloningCache[initialSourceSet] = it
}
}.toList(),
kotlinCompilation.dependencies.map { it.deepCopy(cloningCache) }.toSet(),
KotlinCompilationOutputImpl(kotlinCompilation.output),
KotlinCompilationArgumentsImpl(kotlinCompilation.arguments),
ArrayList(kotlinCompilation.dependencyClasspath)
@@ -126,12 +131,16 @@ data class KotlinTargetImpl(
) : KotlinTarget {
override fun toString() = name
constructor(target: KotlinTarget) : this(
constructor(target: KotlinTarget, cloningCache: MutableMap<Any, Any>) : this(
target.name,
target.presetName,
target.disambiguationClassifier,
KotlinPlatform.byId(target.platform.id) ?: KotlinPlatform.COMMON,
target.compilations.map { KotlinCompilationImpl(it) }.toList(),
target.compilations.map { initialCompilation ->
(cloningCache[initialCompilation] as? KotlinCompilation) ?: KotlinCompilationImpl(initialCompilation, cloningCache).also {
cloningCache[initialCompilation] = it
}
}.toList(),
KotlinTargetJarImpl(target.jar?.archiveFile)
)
}
@@ -147,9 +156,18 @@ data class KotlinMPPGradleModelImpl(
override val kotlinNativeHome: String
) : KotlinMPPGradleModel {
constructor(mppModel: KotlinMPPGradleModel) : this(
mppModel.sourceSets.mapValues { KotlinSourceSetImpl(it.value) },
mppModel.targets.map { KotlinTargetImpl(it) }.toList(),
constructor(mppModel: KotlinMPPGradleModel, cloningCache: MutableMap<Any, Any>) : this(
mppModel.sourceSets.mapValues { initialSourceSet ->
(cloningCache[initialSourceSet] as? KotlinSourceSet) ?: KotlinSourceSetImpl(
initialSourceSet.value,
cloningCache
).also { cloningCache[initialSourceSet] = it }
},
mppModel.targets.map { initialTarget ->
(cloningCache[initialTarget] as? KotlinTarget) ?: KotlinTargetImpl(initialTarget, cloningCache).also {
cloningCache[initialTarget] = it
}
}.toList(),
ExtraFeaturesImpl(mppModel.extraFeatures.coroutinesState),
mppModel.kotlinNativeHome
)