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:
@@ -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 ->
|
||||
|
||||
Reference in New Issue
Block a user