diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt index 771fec82240..5ebca4d38a5 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt @@ -30,6 +30,7 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() { FirSupertypeGenerationExtension::class, FirTypeAttributeExtension::class, FirExpressionResolutionExtension::class, + FirExtensionSessionComponent::class, ) } @@ -68,6 +69,11 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() { registerExtension(FirExpressionResolutionExtension::class, this) } + @JvmName("plusExtensionSessionComponent") + operator fun (FirExtensionSessionComponent.Factory).unaryPlus() { + registerExtension(FirExtensionSessionComponent::class, this) + } + // ------------------ reference methods ------------------ @JvmName("plusStatusTransformerExtension") @@ -99,6 +105,11 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() { operator fun ((FirSession) -> FirExpressionResolutionExtension).unaryPlus() { FirExpressionResolutionExtension.Factory { this.invoke(it) }.unaryPlus() } + + @JvmName("plusExtensionSessionComponent") + operator fun ((FirSession) -> FirExtensionSessionComponent).unaryPlus() { + FirExtensionSessionComponent.Factory { this.invoke(it) }.unaryPlus() + } } @OptIn(PluginServicesInitialization::class) @@ -125,7 +136,6 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() { private var isInitialized: AtomicBoolean = AtomicBoolean(false) private fun
registerExtension(kClass: KClass ) {
- @Suppress("UNCHECKED_CAST")
val registeredExtensions = map.getValue(kClass)
registeredExtensions.extensionFactories += factory
}
@@ -152,5 +162,8 @@ class BunchOfRegisteredExtensions @PluginServicesInitialization constructor(
@OptIn(PluginServicesInitialization::class)
fun FirExtensionService.registerExtensions(registeredExtensions: BunchOfRegisteredExtensions) {
registeredExtensions.extensions.forEach { registerExtensions(it.kClass, it.extensionFactories) }
+ extensionSessionComponents.forEach {
+ session.register(it.componentClass, it)
+ }
session.registeredPluginAnnotations.initialize()
}
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/extensions/FirExtensionSessionComponent.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/extensions/FirExtensionSessionComponent.kt
new file mode 100644
index 00000000000..783d9ce3170
--- /dev/null
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/extensions/FirExtensionSessionComponent.kt
@@ -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