Changes after review

- Replace leaking ModuleResolverTracker with use of ModuleDescriptor.Capabilies
- Provide API for retrieving ResolverForProject from ResolutionFacade
- Update names
This commit is contained in:
Pavel Kirpichenkov
2020-04-28 19:53:32 +03:00
parent db1210fc67
commit 7fff8f82e2
25 changed files with 111 additions and 187 deletions
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.AnchorProvider
import org.jetbrains.kotlin.resolve.RESOLUTION_ANCHOR_PROVIDER_CAPABILITY
import org.jetbrains.kotlin.resolve.ResolutionAnchorProvider
abstract class AbstractResolverForProject<M : ModuleInfo>(
private val debugName: String,
@@ -23,7 +24,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
protected val fallbackModificationTracker: ModificationTracker? = null,
private val delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
private val packageOracleFactory: PackageOracleFactory = PackageOracleFactory.OptimisticFactory,
protected val anchorProvider: AnchorProvider = AnchorProvider.Default,
protected val resolutionAnchorProvider: ResolutionAnchorProvider = ResolutionAnchorProvider.Default,
) : ResolverForProject<M>() {
protected class ModuleData(
@@ -56,14 +57,6 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
abstract fun modulesContent(module: M): ModuleContent<M>
abstract fun builtInsForModule(module: M): KotlinBuiltIns
abstract fun createResolverForModule(descriptor: ModuleDescriptor, moduleInfo: M): ResolverForModule
protected open fun registerModuleDescriptorUpdate(
newDescriptor: ModuleDescriptor,
oldDescriptor: ModuleDescriptor?,
) {
// Nothing by default
}
override fun tryGetResolverForModule(moduleInfo: M): ResolverForModule? {
if (!isCorrectModuleInfo(moduleInfo)) {
return null
@@ -71,7 +64,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
return resolverForModuleDescriptor(doGetDescriptorForModule(moduleInfo))
}
override fun tryGetResolverForModuleWithAnchorCheck(targetModuleInfo: M, referencingModuleInfo: M): ResolverForModule? =
override fun tryGetResolverForModuleWithResolutionAnchorFallback(targetModuleInfo: M, referencingModuleInfo: M): ResolverForModule? =
tryGetResolverForModule(targetModuleInfo)
private fun setupModuleDescriptor(module: M, moduleDescriptor: ModuleDescriptorImpl) {
@@ -158,8 +151,6 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
}
if (moduleData.isOutOfDate()) {
moduleData = recreateModuleDescriptor(moduleFromThisResolver)
} else {
registerModuleDescriptorUpdate(moduleData.moduleDescriptor, null)
}
moduleData.moduleDescriptor
}
@@ -176,9 +167,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
val moduleData = createModuleDescriptor(module)
descriptorByModule[module] = moduleData
registerModuleDescriptorUpdate(moduleData.moduleDescriptor, oldDescriptor)
return moduleData
}
@@ -188,9 +177,8 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
projectContext.storageManager,
builtInsForModule(module),
module.platform,
module.capabilities,
module.capabilities + listOf(RESOLUTION_ANCHOR_PROVIDER_CAPABILITY to resolutionAnchorProvider),
module.stableName,
anchorProvider
)
moduleInfoByDescriptor[moduleDescriptor] = module
setupModuleDescriptor(module, moduleDescriptor)
@@ -43,7 +43,7 @@ class ResolverForModule(
abstract class ResolverForProject<M : ModuleInfo> {
fun resolverForModule(moduleInfo: M): ResolverForModule = resolverForModuleDescriptor(descriptorForModule(moduleInfo))
abstract fun tryGetResolverForModule(moduleInfo: M): ResolverForModule?
abstract fun tryGetResolverForModuleWithAnchorCheck(targetModuleInfo: M, referencingModuleInfo: M): ResolverForModule?
abstract fun tryGetResolverForModuleWithResolutionAnchorFallback(targetModuleInfo: M, referencingModuleInfo: M): ResolverForModule?
abstract fun descriptorForModule(moduleInfo: M): ModuleDescriptor
abstract fun moduleInfoForModuleDescriptor(moduleDescriptor: ModuleDescriptor): M
abstract fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule
@@ -76,7 +76,7 @@ class EmptyResolverForProject<M : ModuleInfo> : ResolverForProject<M>() {
override val allModules: Collection<M> = listOf()
override fun diagnoseUnknownModuleInfo(infos: List<ModuleInfo>) = throw IllegalStateException("Should not be called for $infos")
override fun tryGetResolverForModuleWithAnchorCheck(targetModuleInfo: M, referencingModuleInfo: M) =
override fun tryGetResolverForModuleWithResolutionAnchorFallback(targetModuleInfo: M, referencingModuleInfo: M) =
diagnoseUnknownModuleInfo(listOf(targetModuleInfo))
override fun moduleInfoForModuleDescriptor(descriptor: ModuleDescriptor): M {
@@ -1,28 +0,0 @@
/*
* Copyright 2010-2020 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.analyzer
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
open class ModuleResolverTracker<M : ModuleInfo> {
open fun registerModuleUpdate(
newModule: ModuleDescriptor,
oldModule: ModuleDescriptor?,
resolverForProject: ResolverForProject<M>
) {
}
open fun findResolverForProjectByModuleDescriptor(moduleDescriptor: ModuleDescriptor): ResolverForProject<M>? = null
companion object {
val Default = ModuleResolverTracker<ModuleInfo>()
fun getInstance(project: Project): ModuleResolverTracker<*> =
ServiceManager.getService(project, ModuleResolverTracker::class.java) ?: Default
}
}