ModuleDescriptor: invert "friends" relation

Fixes memory leak caused by modules storing their friends (which can be potentially recreated many times)
This commit is contained in:
Pavel V. Talanov
2016-09-15 16:03:08 +03:00
parent 23c0bdbd05
commit 8f5725345f
5 changed files with 34 additions and 37 deletions
@@ -169,37 +169,33 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
fun computeDependencyDescriptors(module: M): List<ModuleDescriptorImpl> {
val orderedDependencies = firstDependency.singletonOrEmptyList() + module.dependencies()
val dependenciesDescriptors = orderedDependencies.mapTo(ArrayList<ModuleDescriptorImpl>()) {
dependencyInfo ->
resolverForProject.descriptorForModule(dependencyInfo as M)
}
dependencyInfo ->
resolverForProject.descriptorForModule(dependencyInfo as M)
}
module.dependencyOnBuiltIns().adjustDependencies(
resolverForProject.descriptorForModule(module).builtIns.builtInsModule, dependenciesDescriptors)
return dependenciesDescriptors
}
fun computeModulesWhoseInternalsAreVisible(module: M): Set<ModuleDescriptorImpl> {
return module.modulesWhoseInternalsAreVisible().mapTo(LinkedHashSet()) { resolverForProject.descriptorForModule(it as M) }
}
fun setupModuleDependencies() {
modules.forEach {
module ->
resolverForProject.descriptorForModule(module).setDependencies(
LazyModuleDependencies(storageManager) { computeDependencyDescriptors(module) }
LazyModuleDependencies(
storageManager,
{ computeDependencyDescriptors(module) },
{ computeModulesWhoseInternalsAreVisible(module) }
)
)
}
}
setupModuleDependencies()
fun addFriends() {
modules.forEach {
module ->
val descriptor = resolverForProject.descriptorForModule(module)
module.modulesWhoseInternalsAreVisible().forEach {
resolverForProject.descriptorForModule(it as M).addFriend(descriptor)
}
}
}
addFriends()
fun initializeResolverForProject() {
modules.forEach {
module ->