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, factory: FirExtension.Factory

) { - @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 + get() = FirExtensionSessionComponent::class + + open val componentClass: KClass + get() = this::class + + fun interface Factory : FirExtension.Factory +} + +val FirExtensionService.extensionSessionComponents: List by FirExtensionService.registeredExtensions()