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())
}
abstract fun sdkDependency(module: M): M?
abstract fun sdkDependency(module: M, ownerModuleDescriptor: ModuleDescriptorImpl?): M?
abstract fun modulesContent(module: M): ModuleContent<M>
abstract fun builtInsForModule(module: M): KotlinBuiltIns
abstract fun createResolverForModule(descriptor: ModuleDescriptor, moduleInfo: M): ResolverForModule
@@ -68,7 +68,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
LazyModuleDependencies(
projectContext.storageManager,
module,
sdkDependency(module),
sdkDependency(module, moduleDescriptor),
this
)
)
@@ -35,7 +35,7 @@ class ResolverForSingleModuleProject<M : ModuleInfo>(
EmptyResolverForProject(),
PackageOracleFactory.OptimisticFactory
) {
override fun sdkDependency(module: M): M? = sdkDependency
override fun sdkDependency(module: M, ownerModuleDescriptor: ModuleDescriptorImpl?): M? = sdkDependency
init {
knownDependencyModuleDescriptors.forEach { (module, descriptor) ->
@@ -61,4 +61,4 @@ class ResolverForSingleModuleProject<M : ModuleInfo>(
this,
languageVersionSettings
)
}
}
@@ -96,7 +96,7 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
projectContext,
modules
) {
override fun sdkDependency(module: TestModule): TestModule? = null
override fun sdkDependency(module: TestModule, ownerModuleDescriptor: ModuleDescriptorImpl?): TestModule? = null
override fun modulesContent(module: TestModule): ModuleContent<TestModule> =
ModuleContent(module, module.kotlinFiles, module.javaFilesScope)
@@ -59,10 +59,16 @@ class IdeaResolverForProject(
private val builtInsCache: BuiltInsCache =
(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) {
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()
}
@@ -133,7 +139,7 @@ class IdeaResolverForProject(
private val cache = mutableMapOf<BuiltInsCacheKey, KotlinBuiltIns>()
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 cachedBuiltIns = cache[key]
@@ -190,4 +196,4 @@ class IdeaResolverForProject(
interface BuiltInsCacheKey {
object DefaultBuiltInsKey : BuiltInsCacheKey
}
}