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:
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
+2
-2
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+9
-3
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user