[FIR] Add ability to register session components from FIR plugins
This commit is contained in:
committed by
teamcity
parent
60df531c02
commit
b948eaef4b
+14
-1
@@ -30,6 +30,7 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
|
|||||||
FirSupertypeGenerationExtension::class,
|
FirSupertypeGenerationExtension::class,
|
||||||
FirTypeAttributeExtension::class,
|
FirTypeAttributeExtension::class,
|
||||||
FirExpressionResolutionExtension::class,
|
FirExpressionResolutionExtension::class,
|
||||||
|
FirExtensionSessionComponent::class,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,6 +69,11 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
|
|||||||
registerExtension(FirExpressionResolutionExtension::class, this)
|
registerExtension(FirExpressionResolutionExtension::class, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmName("plusExtensionSessionComponent")
|
||||||
|
operator fun (FirExtensionSessionComponent.Factory).unaryPlus() {
|
||||||
|
registerExtension(FirExtensionSessionComponent::class, this)
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------ reference methods ------------------
|
// ------------------ reference methods ------------------
|
||||||
|
|
||||||
@JvmName("plusStatusTransformerExtension")
|
@JvmName("plusStatusTransformerExtension")
|
||||||
@@ -99,6 +105,11 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
|
|||||||
operator fun ((FirSession) -> FirExpressionResolutionExtension).unaryPlus() {
|
operator fun ((FirSession) -> FirExpressionResolutionExtension).unaryPlus() {
|
||||||
FirExpressionResolutionExtension.Factory { this.invoke(it) }.unaryPlus()
|
FirExpressionResolutionExtension.Factory { this.invoke(it) }.unaryPlus()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmName("plusExtensionSessionComponent")
|
||||||
|
operator fun ((FirSession) -> FirExtensionSessionComponent).unaryPlus() {
|
||||||
|
FirExtensionSessionComponent.Factory { this.invoke(it) }.unaryPlus()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(PluginServicesInitialization::class)
|
@OptIn(PluginServicesInitialization::class)
|
||||||
@@ -125,7 +136,6 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
|
|||||||
private var isInitialized: AtomicBoolean = AtomicBoolean(false)
|
private var isInitialized: AtomicBoolean = AtomicBoolean(false)
|
||||||
|
|
||||||
private fun <P : FirExtension> registerExtension(kClass: KClass<out P>, factory: FirExtension.Factory<P>) {
|
private fun <P : FirExtension> registerExtension(kClass: KClass<out P>, factory: FirExtension.Factory<P>) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val registeredExtensions = map.getValue(kClass)
|
val registeredExtensions = map.getValue(kClass)
|
||||||
registeredExtensions.extensionFactories += factory
|
registeredExtensions.extensionFactories += factory
|
||||||
}
|
}
|
||||||
@@ -152,5 +162,8 @@ class BunchOfRegisteredExtensions @PluginServicesInitialization constructor(
|
|||||||
@OptIn(PluginServicesInitialization::class)
|
@OptIn(PluginServicesInitialization::class)
|
||||||
fun FirExtensionService.registerExtensions(registeredExtensions: BunchOfRegisteredExtensions) {
|
fun FirExtensionService.registerExtensions(registeredExtensions: BunchOfRegisteredExtensions) {
|
||||||
registeredExtensions.extensions.forEach { registerExtensions(it.kClass, it.extensionFactories) }
|
registeredExtensions.extensions.forEach { registerExtensions(it.kClass, it.extensionFactories) }
|
||||||
|
extensionSessionComponents.forEach {
|
||||||
|
session.register(it.componentClass, it)
|
||||||
|
}
|
||||||
session.registeredPluginAnnotations.initialize()
|
session.registeredPluginAnnotations.initialize()
|
||||||
}
|
}
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 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.fir.extensions
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
abstract class FirExtensionSessionComponent(session: FirSession) : FirExtension(session), FirSessionComponent {
|
||||||
|
companion object {
|
||||||
|
val NAME = FirExtensionPointName("ExtensionSessionComponent")
|
||||||
|
}
|
||||||
|
|
||||||
|
final override val name: FirExtensionPointName
|
||||||
|
get() = NAME
|
||||||
|
|
||||||
|
final override val extensionType: KClass<out FirExtension>
|
||||||
|
get() = FirExtensionSessionComponent::class
|
||||||
|
|
||||||
|
open val componentClass: KClass<out FirExtensionSessionComponent>
|
||||||
|
get() = this::class
|
||||||
|
|
||||||
|
fun interface Factory : FirExtension.Factory<FirExtensionSessionComponent>
|
||||||
|
}
|
||||||
|
|
||||||
|
val FirExtensionService.extensionSessionComponents: List<FirExtensionSessionComponent> by FirExtensionService.registeredExtensions()
|
||||||
Reference in New Issue
Block a user