[FIR] Fix registration of multiple compiler plugins

This commit is contained in:
Dmitriy Novozhilov
2022-06-21 13:34:33 +03:00
committed by teamcity
parent 0c6a9d3eac
commit 22dae9bff4
2 changed files with 15 additions and 20 deletions
@@ -142,46 +142,48 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
ExtensionRegistrarContext().configurePlugin()
}
return BunchOfRegisteredExtensions(map.values)
return BunchOfRegisteredExtensions(map)
}
class RegisteredExtensionsFactories(val kClass: KClass<out FirExtension>) {
val extensionFactories: MutableList<FirExtension.Factory<FirExtension>> = mutableListOf()
}
private val map: Map<KClass<out FirExtension>, RegisteredExtensionsFactories> = AVAILABLE_EXTENSIONS.associateWith {
RegisteredExtensionsFactories(it)
private val map: Map<KClass<out FirExtension>, MutableList<FirExtension.Factory<FirExtension>>> = AVAILABLE_EXTENSIONS.associateWith {
mutableListOf()
}
private var isInitialized: AtomicBoolean = AtomicBoolean(false)
private fun <P : FirExtension> registerExtension(kClass: KClass<out P>, factory: FirExtension.Factory<P>) {
val registeredExtensions = map.getValue(kClass)
registeredExtensions.extensionFactories += factory
registeredExtensions += factory
}
}
class BunchOfRegisteredExtensions @PluginServicesInitialization constructor(
val extensions: Collection<FirExtensionRegistrar.RegisteredExtensionsFactories>
val extensions: Map<KClass<out FirExtension>, List<FirExtension.Factory<FirExtension>>>
) {
companion object {
@OptIn(PluginServicesInitialization::class)
fun empty(): BunchOfRegisteredExtensions {
val extensions = FirExtensionRegistrar.AVAILABLE_EXTENSIONS.map { FirExtensionRegistrar.RegisteredExtensionsFactories(it) }
return BunchOfRegisteredExtensions(extensions)
return BunchOfRegisteredExtensions(FirExtensionRegistrar.AVAILABLE_EXTENSIONS.associateWith { listOf() })
}
}
@OptIn(PluginServicesInitialization::class)
operator fun plus(other: BunchOfRegisteredExtensions): BunchOfRegisteredExtensions {
return BunchOfRegisteredExtensions(extensions + other.extensions)
val combinedExtensions = buildMap {
for (extensionClass in FirExtensionRegistrar.AVAILABLE_EXTENSIONS) {
put(extensionClass, extensions.getValue(extensionClass) + other.extensions.getValue(extensionClass))
}
}
return BunchOfRegisteredExtensions(combinedExtensions)
}
}
@SessionConfiguration
@OptIn(PluginServicesInitialization::class)
fun FirExtensionService.registerExtensions(registeredExtensions: BunchOfRegisteredExtensions) {
registeredExtensions.extensions.forEach { registerExtensions(it.kClass, it.extensionFactories) }
registeredExtensions.extensions.forEach { (extensionClass, extensionFactories) ->
registerExtensions(extensionClass, extensionFactories)
}
extensionSessionComponents.forEach {
session.register(it.componentClass, it)
}
@@ -105,9 +105,6 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
needRegisterJavaElementFinder = true
) {
configureSession()
getFirExtensions()?.let {
registerExtensions(it)
}
}
}
@@ -127,10 +124,6 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
runAnalysis(testDataFile, files, firFilesPerSession)
}
protected open fun getFirExtensions(): BunchOfRegisteredExtensions? {
return null
}
private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List<KtFile>, firFiles: MutableList<FirFile>, useLightTree: Boolean) {
val firProvider = (session.firProvider as FirProviderImpl)
if (useLightTree) {