Probably fix issue with creating module descriptor for SDK twice

During creation and initialization of module descriptor for sdk
  in IdeaResolverForProject.BuiltInsCache.getOrCreateIfNeeded
  AbstractResolverForProject asks for sdk dependency for module
  descriptor for this sdk, so sometimes this module descriptor was
  created twice

#KT-42001 Fixed
EA-211562
This commit is contained in:
Dmitriy Novozhilov
2020-12-18 11:25:31 +03:00
parent 6296f6dc33
commit 92adccde47
4 changed files with 14 additions and 8 deletions
@@ -52,7 +52,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
assert(moduleInfoToResolvableInfo.values.toSet() == modules.toSet()) assert(moduleInfoToResolvableInfo.values.toSet() == modules.toSet())
} }
abstract fun sdkDependency(module: M): M? abstract fun sdkDependency(module: M, ownerModuleDescriptor: ModuleDescriptorImpl?): M?
abstract fun modulesContent(module: M): ModuleContent<M> abstract fun modulesContent(module: M): ModuleContent<M>
abstract fun builtInsForModule(module: M): KotlinBuiltIns abstract fun builtInsForModule(module: M): KotlinBuiltIns
abstract fun createResolverForModule(descriptor: ModuleDescriptor, moduleInfo: M): ResolverForModule abstract fun createResolverForModule(descriptor: ModuleDescriptor, moduleInfo: M): ResolverForModule
@@ -68,7 +68,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
LazyModuleDependencies( LazyModuleDependencies(
projectContext.storageManager, projectContext.storageManager,
module, module,
sdkDependency(module), sdkDependency(module, moduleDescriptor),
this this
) )
) )
@@ -35,7 +35,7 @@ class ResolverForSingleModuleProject<M : ModuleInfo>(
EmptyResolverForProject(), EmptyResolverForProject(),
PackageOracleFactory.OptimisticFactory PackageOracleFactory.OptimisticFactory
) { ) {
override fun sdkDependency(module: M): M? = sdkDependency override fun sdkDependency(module: M, ownerModuleDescriptor: ModuleDescriptorImpl?): M? = sdkDependency
init { init {
knownDependencyModuleDescriptors.forEach { (module, descriptor) -> knownDependencyModuleDescriptors.forEach { (module, descriptor) ->
@@ -96,7 +96,7 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
projectContext, projectContext,
modules modules
) { ) {
override fun sdkDependency(module: TestModule): TestModule? = null override fun sdkDependency(module: TestModule, ownerModuleDescriptor: ModuleDescriptorImpl?): TestModule? = null
override fun modulesContent(module: TestModule): ModuleContent<TestModule> = override fun modulesContent(module: TestModule): ModuleContent<TestModule> =
ModuleContent(module, module.kotlinFiles, module.javaFilesScope) ModuleContent(module, module.kotlinFiles, module.javaFilesScope)
@@ -59,10 +59,16 @@ class IdeaResolverForProject(
private val builtInsCache: BuiltInsCache = private val builtInsCache: BuiltInsCache =
(delegateResolver as? IdeaResolverForProject)?.builtInsCache ?: BuiltInsCache(projectContext, this) (delegateResolver as? IdeaResolverForProject)?.builtInsCache ?: BuiltInsCache(projectContext, this)
override fun sdkDependency(module: IdeaModuleInfo): SdkInfo? { override fun sdkDependency(module: IdeaModuleInfo, ownerModuleDescriptor: ModuleDescriptorImpl?): SdkInfo? {
if (projectContext.project.useCompositeAnalysis) { if (projectContext.project.useCompositeAnalysis) {
require(constantSdkDependencyIfAny == null) { "Shouldn't pass SDK dependency manually for composite analysis mode" } require(constantSdkDependencyIfAny == null) { "Shouldn't pass SDK dependency manually for composite analysis mode" }
} }
// This is needed for case when we find sdk dependency for module descriptor of
// that sdk itself. There was some situations when we create additional module
// descriptor for one SdkInfo
if (module is SdkInfo && ownerModuleDescriptor?.getCapability(ModuleInfo.Capability) == module) {
return module
}
return constantSdkDependencyIfAny ?: module.findSdkAcrossDependencies() return constantSdkDependencyIfAny ?: module.findSdkAcrossDependencies()
} }
@@ -133,7 +139,7 @@ class IdeaResolverForProject(
private val cache = mutableMapOf<BuiltInsCacheKey, KotlinBuiltIns>() private val cache = mutableMapOf<BuiltInsCacheKey, KotlinBuiltIns>()
fun getOrCreateIfNeeded(module: IdeaModuleInfo): KotlinBuiltIns = projectContextFromSdkResolver.storageManager.compute { fun getOrCreateIfNeeded(module: IdeaModuleInfo): KotlinBuiltIns = projectContextFromSdkResolver.storageManager.compute {
val sdk = resolverForSdk.sdkDependency(module) val sdk = resolverForSdk.sdkDependency(module, null)
val key = module.platform.idePlatformKind.resolution.getKeyForBuiltIns(module, sdk) val key = module.platform.idePlatformKind.resolution.getKeyForBuiltIns(module, sdk)
val cachedBuiltIns = cache[key] val cachedBuiltIns = cache[key]