Add ability to invalidate AbstractResolverForProject
#KTIJ-23785 Merge-request: KT-MR-7900 Merged-by: Vladimir Dolzhenko <Vladimir.Dolzhenko@jetbrains.com>
This commit is contained in:
committed by
Space Team
parent
957987c16a
commit
b4aa2aef00
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analyzer
|
package org.jetbrains.kotlin.analyzer
|
||||||
|
|
||||||
|
import com.intellij.openapi.Disposable
|
||||||
import com.intellij.openapi.util.ModificationTracker
|
import com.intellij.openapi.util.ModificationTracker
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.context.ProjectContext
|
import org.jetbrains.kotlin.context.ProjectContext
|
||||||
@@ -22,7 +23,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
protected val fallbackModificationTracker: ModificationTracker? = null,
|
protected val fallbackModificationTracker: ModificationTracker? = null,
|
||||||
private val delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
|
private val delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
|
||||||
private val packageOracleFactory: PackageOracleFactory = PackageOracleFactory.OptimisticFactory
|
private val packageOracleFactory: PackageOracleFactory = PackageOracleFactory.OptimisticFactory
|
||||||
) : ResolverForProject<M>() {
|
) : ResolverForProject<M>(), Disposable {
|
||||||
|
|
||||||
protected class ModuleData(
|
protected class ModuleData(
|
||||||
val moduleDescriptor: ModuleDescriptorImpl,
|
val moduleDescriptor: ModuleDescriptorImpl,
|
||||||
@@ -36,6 +37,9 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Volatile
|
||||||
|
protected var disposed = false
|
||||||
|
|
||||||
// Protected by ("projectContext.storageManager.lock")
|
// Protected by ("projectContext.storageManager.lock")
|
||||||
protected val descriptorByModule = hashMapOf<M, ModuleData>()
|
protected val descriptorByModule = hashMapOf<M, ModuleData>()
|
||||||
|
|
||||||
@@ -55,6 +59,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
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
|
||||||
override fun tryGetResolverForModule(moduleInfo: M): ResolverForModule? {
|
override fun tryGetResolverForModule(moduleInfo: M): ResolverForModule? {
|
||||||
|
checkValid()
|
||||||
if (!isCorrectModuleInfo(moduleInfo)) {
|
if (!isCorrectModuleInfo(moduleInfo)) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@@ -62,6 +67,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun setupModuleDescriptor(module: M, moduleDescriptor: ModuleDescriptorImpl) {
|
private fun setupModuleDescriptor(module: M, moduleDescriptor: ModuleDescriptorImpl) {
|
||||||
|
checkValid()
|
||||||
moduleDescriptor.setDependencies(
|
moduleDescriptor.setDependencies(
|
||||||
LazyModuleDependencies(
|
LazyModuleDependencies(
|
||||||
projectContext.storageManager,
|
projectContext.storageManager,
|
||||||
@@ -124,7 +130,9 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
*/
|
*/
|
||||||
private fun resolverForModuleDescriptorImpl(descriptor: ModuleDescriptor): ResolverForModule? {
|
private fun resolverForModuleDescriptorImpl(descriptor: ModuleDescriptor): ResolverForModule? {
|
||||||
return projectContext.storageManager.compute {
|
return projectContext.storageManager.compute {
|
||||||
|
checkValid()
|
||||||
descriptor.assertValid()
|
descriptor.assertValid()
|
||||||
|
|
||||||
val module = moduleInfoByDescriptor[descriptor]
|
val module = moduleInfoByDescriptor[descriptor]
|
||||||
if (module == null) {
|
if (module == null) {
|
||||||
if (delegateResolver is EmptyResolverForProject<*>) {
|
if (delegateResolver is EmptyResolverForProject<*>) {
|
||||||
@@ -148,11 +156,13 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun descriptorForModule(moduleInfo: M): ModuleDescriptorImpl {
|
override fun descriptorForModule(moduleInfo: M): ModuleDescriptorImpl {
|
||||||
|
checkValid()
|
||||||
checkModuleIsCorrect(moduleInfo)
|
checkModuleIsCorrect(moduleInfo)
|
||||||
return doGetDescriptorForModule(moduleInfo)
|
return doGetDescriptorForModule(moduleInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun moduleInfoForModuleDescriptor(moduleDescriptor: ModuleDescriptor): M {
|
override fun moduleInfoForModuleDescriptor(moduleDescriptor: ModuleDescriptor): M {
|
||||||
|
checkValid()
|
||||||
return moduleInfoByDescriptor[moduleDescriptor] ?: delegateResolver.moduleInfoForModuleDescriptor(moduleDescriptor)
|
return moduleInfoByDescriptor[moduleDescriptor] ?: delegateResolver.moduleInfoForModuleDescriptor(moduleDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,6 +225,29 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
return ModuleData(moduleDescriptor, modificationTracker)
|
return ModuleData(moduleDescriptor, modificationTracker)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkValid() {
|
||||||
|
if (disposed) {
|
||||||
|
reportInvalidResolver()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open fun reportInvalidResolver() {
|
||||||
|
throw InvalidResolverException("$name is invalidated")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun dispose() {
|
||||||
|
projectContext.storageManager.compute {
|
||||||
|
disposed = true
|
||||||
|
descriptorByModule.values.forEach {
|
||||||
|
moduleInfoByDescriptor.remove(it.moduleDescriptor)
|
||||||
|
it.moduleDescriptor.isValid = false
|
||||||
|
}
|
||||||
|
descriptorByModule.clear()
|
||||||
|
moduleInfoByDescriptor.keys.forEach { it.isValid = false }
|
||||||
|
moduleInfoByDescriptor.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun renderResolversChainContents(): String {
|
private fun renderResolversChainContents(): String {
|
||||||
val resolversChain = generateSequence(this) { it.delegateResolver as? AbstractResolverForProject<M> }
|
val resolversChain = generateSequence(this) { it.delegateResolver as? AbstractResolverForProject<M> }
|
||||||
|
|
||||||
@@ -334,3 +367,5 @@ private object DiagnoseUnknownModuleInfoReporter {
|
|||||||
|
|
||||||
private fun otherError(message: String) = KotlinExceptionWithAttachments(message)
|
private fun otherError(message: String) = KotlinExceptionWithAttachments(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class InvalidResolverException(message: String) : IllegalStateException(message)
|
||||||
Reference in New Issue
Block a user