[AA] KT-58257 Implement KtStaticModuleDependentsProvider (standalone)

This commit is contained in:
Marco Pennekamp
2023-05-04 21:37:51 +02:00
committed by Space Team
parent fe3f7feae4
commit 027fd5600f
4 changed files with 77 additions and 6 deletions
@@ -0,0 +1,37 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.analysis.api.standalone.base.project.structure
import com.intellij.util.containers.ContainerUtil.createConcurrentSoftMap
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.allDirectDependencies
import org.jetbrains.kotlin.analysis.project.structure.impl.KotlinModuleDependentsProviderBase
class KtStaticModuleDependentsProvider(private val modules: List<KtModule>) : KotlinModuleDependentsProviderBase() {
private val directDependentsByKtModule: Map<KtModule, Set<KtModule>> by lazy {
// Direct dependencies should be computed lazily, because the built-ins module will be reachable via module dependencies. Getting
// the built-ins module relies on the built-ins session, which may depend on services that are registered after
// `KtStaticModuleDependentsProvider`.
buildMap<KtModule, MutableSet<KtModule>> {
for (module in modules) {
for (dependency in module.allDirectDependencies()) {
// `module` should not be part of its own dependents, per the contract of `KotlinModuleDependentsProvider`.
if (dependency == module) continue
val dependents = computeIfAbsent(dependency) { mutableSetOf<KtModule>() }
dependents.add(module)
}
}
}
}
private val transitiveDependentsByKtModule = createConcurrentSoftMap<KtModule, Set<KtModule>>()
override fun getDirectDependents(module: KtModule): Set<KtModule> = directDependentsByKtModule[module] ?: emptySet()
override fun getTransitiveDependents(module: KtModule): Set<KtModule> =
transitiveDependentsByKtModule.computeIfAbsent(module) { computeTransitiveDependents(it) }
}
@@ -178,10 +178,13 @@ object StandaloneProjectFactory {
registerService(ModuleAnnotationsResolver::class.java, CliModuleAnnotationsResolver())
}
val modules = projectStructureProvider.allKtModules
project.registerService(ProjectStructureProvider::class.java, projectStructureProvider)
project.registerService(KotlinModuleDependentsProvider::class.java, KtStaticModuleDependentsProvider(modules))
initialiseVirtualFileFinderServices(
environment,
projectStructureProvider.allKtModules,
modules,
projectStructureProvider.allSourceFiles,
languageVersionSettings,
jdkHome,