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:
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user