FE: introduce FirComposableSessionComponent.Single
diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/FirJvmOverridesBackwardCompatibilityHelper.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/FirJvmOverridesBackwardCompatibilityHelper.kt
index 7d7fa6b..e422ca2 100644
--- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/FirJvmOverridesBackwardCompatibilityHelper.kt
+++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/FirJvmOverridesBackwardCompatibilityHelper.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.fir.analysis.jvm
 
 import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.analysis.FirOverridesBackwardCompatibilityHelper
 import org.jetbrains.kotlin.fir.containingClassLookupTag
 import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
@@ -18,7 +19,8 @@
  * For example, overriding members of
  *    `kotlin.Throwable` does not require `override` keyword.
  */
-object FirJvmOverridesBackwardCompatibilityHelper : FirOverridesBackwardCompatibilityHelper() {
+object FirJvmOverridesBackwardCompatibilityHelper : FirOverridesBackwardCompatibilityHelper(),
+    FirComposableSessionComponent.Single<FirOverridesBackwardCompatibilityHelper> {
     override fun additionalCheck(member: FirCallableSymbol<*>): Boolean? {
         if (member.origin == FirDeclarationOrigin.Synthetic.FakeHiddenInPreparationForNewJdk) return true
 
diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJavaNullabilityWarningUpperBoundsProvider.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJavaNullabilityWarningUpperBoundsProvider.kt
index e9f1e1b..f0d2ea4 100644
--- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJavaNullabilityWarningUpperBoundsProvider.kt
+++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJavaNullabilityWarningUpperBoundsProvider.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.fir.analysis.jvm.checkers
 
 import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactory2
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.analysis.checkers.FirPlatformUpperBoundsProvider
 import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
@@ -13,7 +14,8 @@
 import org.jetbrains.kotlin.fir.types.ConeKotlinType
 import org.jetbrains.kotlin.fir.types.typeContext
 
-class FirJavaNullabilityWarningUpperBoundsProvider(session: FirSession) : FirPlatformUpperBoundsProvider() {
+class FirJavaNullabilityWarningUpperBoundsProvider(session: FirSession) : FirPlatformUpperBoundsProvider(),
+    FirComposableSessionComponent.Single<FirPlatformUpperBoundsProvider> {
     private val substitutor: EnhancedForWarningConeSubstitutor = EnhancedForWarningConeSubstitutor(
         session.typeContext,
     )
diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmAnnotationsPlatformSpecificSupportComponent.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmAnnotationsPlatformSpecificSupportComponent.kt
index 932b907..96f0a7b 100644
--- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmAnnotationsPlatformSpecificSupportComponent.kt
+++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmAnnotationsPlatformSpecificSupportComponent.kt
@@ -5,6 +5,7 @@
 
 package org.jetbrains.kotlin.fir.analysis.jvm.checkers
 
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.declarations.*
 import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -13,7 +14,8 @@
 import org.jetbrains.kotlin.name.JvmStandardClassIds
 import org.jetbrains.kotlin.name.StandardClassIds
 
-object FirJvmAnnotationsPlatformSpecificSupportComponent : FirAnnotationsPlatformSpecificSupportComponent() {
+object FirJvmAnnotationsPlatformSpecificSupportComponent : FirAnnotationsPlatformSpecificSupportComponent(),
+    FirComposableSessionComponent.Single<FirAnnotationsPlatformSpecificSupportComponent> {
     override val requiredAnnotationsWithArguments: Set<ClassId> = setOf(
         StandardClassIds.Annotations.Deprecated,
         StandardClassIds.Annotations.Target,
diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmInlineCheckerComponent.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmInlineCheckerComponent.kt
index 3f367ef..f6aa306 100644
--- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmInlineCheckerComponent.kt
+++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmInlineCheckerComponent.kt
@@ -7,6 +7,7 @@
 
 import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
 import org.jetbrains.kotlin.diagnostics.reportOn
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.analysis.checkers.FirInlineCheckerPlatformSpecificComponent
 import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
 import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isLocalMember
@@ -17,7 +18,7 @@
 import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
 import org.jetbrains.kotlin.fir.symbols.impl.FirScriptSymbol
 
-class FirJvmInlineCheckerComponent : FirInlineCheckerPlatformSpecificComponent() {
+class FirJvmInlineCheckerComponent : FirInlineCheckerPlatformSpecificComponent(), FirComposableSessionComponent.Single<FirInlineCheckerPlatformSpecificComponent> {
     context(context: CheckerContext, reporter: DiagnosticReporter)
     override fun isGenerallyOk(declaration: FirDeclaration): Boolean {
         // local inline functions are prohibited
diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmPrimaryConstructorSuperTypeCheckerPlatformComponent.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmPrimaryConstructorSuperTypeCheckerPlatformComponent.kt
index e023738..b1c74f9 100644
--- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmPrimaryConstructorSuperTypeCheckerPlatformComponent.kt
+++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmPrimaryConstructorSuperTypeCheckerPlatformComponent.kt
@@ -5,12 +5,14 @@
 
 package org.jetbrains.kotlin.fir.analysis.jvm.checkers
 
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.analysis.checkers.FirPrimaryConstructorSuperTypeCheckerPlatformComponent
 import org.jetbrains.kotlin.name.ClassId
 import org.jetbrains.kotlin.name.JvmStandardClassIds
 import org.jetbrains.kotlin.name.StandardClassIds
 
-object FirJvmPrimaryConstructorSuperTypeCheckerPlatformComponent : FirPrimaryConstructorSuperTypeCheckerPlatformComponent() {
+object FirJvmPrimaryConstructorSuperTypeCheckerPlatformComponent : FirPrimaryConstructorSuperTypeCheckerPlatformComponent(),
+    FirComposableSessionComponent.Single<FirPrimaryConstructorSuperTypeCheckerPlatformComponent> {
     override val supertypesThatDontNeedInitializationInSubtypesConstructors: Set<ClassId> =
         setOf(StandardClassIds.Enum, JvmStandardClassIds.Java.Record)
 }
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/FirDefaultOverridesBackwardCompatibilityHelper.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/FirDefaultOverridesBackwardCompatibilityHelper.kt
index 24255b1..253b222 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/FirDefaultOverridesBackwardCompatibilityHelper.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/FirDefaultOverridesBackwardCompatibilityHelper.kt
@@ -5,4 +5,7 @@
 
 package org.jetbrains.kotlin.fir.analysis
 
-object FirDefaultOverridesBackwardCompatibilityHelper : FirOverridesBackwardCompatibilityHelper()
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
+
+object FirDefaultOverridesBackwardCompatibilityHelper : FirOverridesBackwardCompatibilityHelper(),
+    FirComposableSessionComponent.Single<FirOverridesBackwardCompatibilityHelper>
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirPrimaryConstructorSuperTypeCheckerPlatformComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirPrimaryConstructorSuperTypeCheckerPlatformComponent.kt
index 136ed1b..66d2c76 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirPrimaryConstructorSuperTypeCheckerPlatformComponent.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirPrimaryConstructorSuperTypeCheckerPlatformComponent.kt
@@ -14,7 +14,7 @@
 abstract class FirPrimaryConstructorSuperTypeCheckerPlatformComponent : FirComposableSessionComponent<FirPrimaryConstructorSuperTypeCheckerPlatformComponent> {
     abstract val supertypesThatDontNeedInitializationInSubtypesConstructors: Set<ClassId>
 
-    object Default : FirPrimaryConstructorSuperTypeCheckerPlatformComponent() {
+    object Default : FirPrimaryConstructorSuperTypeCheckerPlatformComponent(), FirComposableSessionComponent.Single<FirPrimaryConstructorSuperTypeCheckerPlatformComponent> {
         override val supertypesThatDontNeedInitializationInSubtypesConstructors: Set<ClassId> = setOf(StandardClassIds.Enum)
     }
 
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt
index 10cd5a71d..d83027f 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt
@@ -86,7 +86,7 @@
     register(FirSamConstructorStorage::class, FirSamConstructorStorage(this))
     register(FirOverrideService::class, FirOverrideService(this))
     register(FirDynamicMembersStorage::class, FirDynamicMembersStorage(this))
-    register(FirEnumEntriesSupport(this))
+    register(FirEnumEntriesSupport::class, FirEnumEntriesSupport.Default(this))
     register(FirOverrideChecker::class, FirStandardOverrideChecker(this))
     register(FirDeclarationOverloadabilityHelper::class, FirDeclarationOverloadabilityHelperImpl(this))
     register(FirAnnotationsPlatformSpecificSupportComponent.Default)
@@ -153,7 +153,10 @@
     )
     register(FirEnhancedSymbolsStorage::class, predefinedComponents?.enhancementStorage ?: FirEnhancedSymbolsStorage(this))
     register(FirMappedSymbolStorage::class, predefinedComponents?.mappedStorage ?: FirMappedSymbolStorage(this))
-    register(FirRenamedForOverrideSymbolsStorage::class, predefinedComponents?.renamedFunctionsStorage ?: FirRenamedForOverrideSymbolsStorage(this))
+    register(
+        FirRenamedForOverrideSymbolsStorage::class,
+        predefinedComponents?.renamedFunctionsStorage ?: FirRenamedForOverrideSymbolsStorage(this)
+    )
     register(FirSyntheticPropertiesStorage::class, FirSyntheticPropertiesStorage(this))
     register(PlatformSupertypeUpdater::class, JvmSupertypeUpdater(this))
     register(JavaOverridabilityRules(this))
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt
index fd60778..7ffa0fd 100644
--- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt
+++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt
@@ -24,7 +24,7 @@
 import org.jetbrains.kotlin.name.FqName
 
 @NoMutableState
-object FirJavaVisibilityChecker : FirVisibilityChecker() {
+object FirJavaVisibilityChecker : FirVisibilityChecker(), FirComposableSessionComponent.Single<FirVisibilityChecker> {
     override fun platformVisibilityCheck(
         declarationVisibility: Visibility,
         symbol: FirBasedSymbol<*>,
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/deserialization/FirJvmDeserializationExtension.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/deserialization/FirJvmDeserializationExtension.kt
index 6e34df0..4521cd7 100644
--- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/deserialization/FirJvmDeserializationExtension.kt
+++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/deserialization/FirJvmDeserializationExtension.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.fir.java.deserialization
 
 import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder
 import org.jetbrains.kotlin.fir.deserialization.FirConstDeserializer
@@ -24,7 +25,8 @@
 import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol
 import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
 
-class FirJvmDeserializationExtension(session: FirSession) : FirDeserializationExtension(session) {
+class FirJvmDeserializationExtension(session: FirSession) : FirDeserializationExtension(session),
+    FirComposableSessionComponent.Single<FirDeserializationExtension> {
     override fun createConstDeserializer(
         containerSource: DeserializedContainerSource?,
         session: FirSession,
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverridabilityRules.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverridabilityRules.kt
index b5aa750..faffb81 100644
--- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverridabilityRules.kt
+++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/java/scopes/JavaOverridabilityRules.kt
@@ -7,6 +7,7 @@
 
 import org.jetbrains.kotlin.config.LanguageFeature
 import org.jetbrains.kotlin.descriptors.Visibility
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
 import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
@@ -19,7 +20,7 @@
 import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
 import org.jetbrains.kotlin.fir.unwrapFakeOverrides
 
-class JavaOverridabilityRules(private val session: FirSession) : PlatformSpecificOverridabilityRules() {
+class JavaOverridabilityRules(private val session: FirSession) : PlatformSpecificOverridabilityRules(), FirComposableSessionComponent.Single<PlatformSpecificOverridabilityRules> {
     // Note: return types (considerReturnTypeKinds) look not important when attempting intersection
     // From the other side, they can break relevant tests like intersectionWithJavaVoidNothing.kt
     // The similar case exists in bootstrap (see IrSimpleBuiltinOperatorDescriptorImpl)
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaClassMapper.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaClassMapper.kt
index db00b02..140808a 100644
--- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaClassMapper.kt
+++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaClassMapper.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.fir.resolve
 
 import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.NoMutableState
 import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
@@ -16,7 +17,8 @@
 import org.jetbrains.kotlin.name.JvmStandardClassIds
 
 @NoMutableState
-class FirJavaClassMapper(private val session: FirSession) : FirPlatformClassMapper() {
+class FirJavaClassMapper(private val session: FirSession) : FirPlatformClassMapper(),
+    FirComposableSessionComponent.Single<FirPlatformClassMapper> {
     override fun getCorrespondingPlatformClass(declaration: FirClassLikeDeclaration): FirRegularClass? {
         val javaClassId = getCorrespondingPlatformClass(declaration.symbol.classId)
         return javaClassId?.let { session.symbolProvider.getClassLikeSymbolByClassId(it)?.fir } as? FirRegularClass
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt
index 3c989c0..a8f7bd44 100644
--- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt
+++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt
@@ -5,21 +5,14 @@
 
 package org.jetbrains.kotlin.fir.resolve.calls.jvm
 
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.NoMutableState
-import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
 import org.jetbrains.kotlin.fir.resolve.calls.overloads.ConeCallConflictResolver
 import org.jetbrains.kotlin.fir.resolve.calls.overloads.ConeCallConflictResolverFactory
-import org.jetbrains.kotlin.fir.resolve.calls.overloads.ConeCompositeConflictResolver
-import org.jetbrains.kotlin.fir.resolve.calls.overloads.ConeEquivalentCallConflictResolver
-import org.jetbrains.kotlin.fir.resolve.calls.overloads.ConeIntegerOperatorConflictResolver
-import org.jetbrains.kotlin.fir.resolve.calls.overloads.ConeOverloadConflictResolver
-import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents
-import org.jetbrains.kotlin.fir.types.typeContext
-import org.jetbrains.kotlin.resolve.jvm.JvmTypeSpecificityComparator
 
 @NoMutableState
-object JvmCallConflictResolverFactory : ConeCallConflictResolverFactory() {
+object JvmCallConflictResolverFactory : ConeCallConflictResolverFactory(), FirComposableSessionComponent.Single<ConeCallConflictResolverFactory> {
     override fun createAdditionalResolvers(session: FirSession): List<ConeCallConflictResolver> {
         return listOf(JvmPlatformOverloadsConflictResolver(session))
     }
diff --git a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/FirJvmDelegatedMembersFilter.kt b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/FirJvmDelegatedMembersFilter.kt
index d1958d2..41420a3 100644
--- a/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/FirJvmDelegatedMembersFilter.kt
+++ b/compiler/fir/fir-jvm/src/org/jetbrains/kotlin/fir/scopes/jvm/FirJvmDelegatedMembersFilter.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.fir.scopes.jvm
 
 import org.jetbrains.kotlin.descriptors.Modality
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
 import org.jetbrains.kotlin.fir.declarations.hasAnnotation
@@ -21,7 +22,8 @@
  * KT-18324: If original is java method with default then delegated function should not be generated
  * See org.jetbrains.kotlin.resolve.jvm.JvmDelegationFilter for K1 implementation
  */
-class FirJvmDelegatedMembersFilter(private val session: FirSession) : FirDelegatedMembersFilter() {
+class FirJvmDelegatedMembersFilter(private val session: FirSession) : FirDelegatedMembersFilter(),
+    FirComposableSessionComponent.Single<FirDelegatedMembersFilter> {
     companion object {
         val PLATFORM_DEPENDENT_ANNOTATION_CLASS_ID: ClassId = ClassId.topLevel(FqName("kotlin.internal.PlatformDependent"))
     }
diff --git a/compiler/fir/fir-native/src/org/jetbrains/kotlin/fir/backend/native/FirNativeClassMapper.kt b/compiler/fir/fir-native/src/org/jetbrains/kotlin/fir/backend/native/FirNativeClassMapper.kt
index f8d8349..9280da7 100644
--- a/compiler/fir/fir-native/src/org/jetbrains/kotlin/fir/backend/native/FirNativeClassMapper.kt
+++ b/compiler/fir/fir-native/src/org/jetbrains/kotlin/fir/backend/native/FirNativeClassMapper.kt
@@ -5,13 +5,14 @@
 
 package org.jetbrains.kotlin.fir.backend.native
 
+import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
 import org.jetbrains.kotlin.fir.declarations.FirRegularClass
 import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper
 import org.jetbrains.kotlin.name.ClassId
 import org.jetbrains.kotlin.name.NativeRuntimeNames
 
-class FirNativeClassMapper : FirPlatformClassMapper() {
+class FirNativeClassMapper : FirPlatformClassMapper(), FirComposableSessionComponent.Single<FirPlatformClassMapper> {
     override fun getCorrespondingPlatformClass(declaration: FirClassLikeDeclaration): FirRegularClass? {
         return null
     }
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt
index dd4b200..ed7efc2 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt
@@ -47,7 +47,7 @@
 
 abstract class FirVisibilityChecker : FirComposableSessionComponent<FirVisibilityChecker> {
     @NoMutableState
-    object Default : FirVisibilityChecker() {
+    object Default : FirVisibilityChecker(), FirComposableSessionComponent.Single<FirVisibilityChecker> {
         override fun platformVisibilityCheck(
             declarationVisibility: Visibility,
             symbol: FirBasedSymbol<*>,
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationsPlatformSpecificSupportComponent.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationsPlatformSpecificSupportComponent.kt
index 361c942..5be6f7d 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationsPlatformSpecificSupportComponent.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirAnnotationsPlatformSpecificSupportComponent.kt
@@ -17,7 +17,8 @@
 /**
  * @see org.jetbrains.kotlin.light.classes.symbol.annotations.GranularAnnotationsBox.Companion
  */
-abstract class FirAnnotationsPlatformSpecificSupportComponent : FirComposableSessionComponent<FirAnnotationsPlatformSpecificSupportComponent> {
+abstract class FirAnnotationsPlatformSpecificSupportComponent :
+    FirComposableSessionComponent<FirAnnotationsPlatformSpecificSupportComponent> {
     abstract val requiredAnnotationsWithArguments: Set<ClassId>
     abstract val requiredAnnotations: Set<ClassId>
     abstract val volatileAnnotations: Set<ClassId>
@@ -56,7 +57,8 @@
 
     class Composed(
         override val components: List<FirAnnotationsPlatformSpecificSupportComponent>
-    ) : FirAnnotationsPlatformSpecificSupportComponent(), FirComposableSessionComponent.Composed<FirAnnotationsPlatformSpecificSupportComponent> {
+    ) : FirAnnotationsPlatformSpecificSupportComponent(),
+        FirComposableSessionComponent.Composed<FirAnnotationsPlatformSpecificSupportComponent> {
         override val requiredAnnotationsWithArguments: Set<ClassId> =
             components.flatMapTo(mutableSetOf()) { it.requiredAnnotationsWithArguments }
         override val requiredAnnotations: Set<ClassId> = components.flatMapTo(mutableSetOf()) { it.requiredAnnotations }
@@ -91,7 +93,8 @@
         return Composed(components)
     }
 
-    object Default : FirAnnotationsPlatformSpecificSupportComponent() {
+    object Default : FirAnnotationsPlatformSpecificSupportComponent(),
+        FirComposableSessionComponent.Single<FirAnnotationsPlatformSpecificSupportComponent> {
         override val requiredAnnotationsWithArguments: Set<ClassId> = setOf(
             StandardClassIds.Annotations.Deprecated,
             StandardClassIds.Annotations.Target,
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirTypeSpecificityComparatorProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirTypeSpecificityComparatorProvider.kt
index a40c946..02c0c23 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirTypeSpecificityComparatorProvider.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/FirTypeSpecificityComparatorProvider.kt
@@ -13,7 +13,7 @@
 sealed class FirTypeSpecificityComparatorProvider : FirComposableSessionComponent<FirTypeSpecificityComparatorProvider> {
     abstract val typeSpecificityComparator: TypeSpecificityComparator
 
-    class Simple(override val typeSpecificityComparator: TypeSpecificityComparator) : FirTypeSpecificityComparatorProvider()
+    class Simple(override val typeSpecificityComparator: TypeSpecificityComparator) : FirTypeSpecificityComparatorProvider(), FirComposableSessionComponent.Single<FirTypeSpecificityComparatorProvider> {}
 
     class Composed(
         override val components: List<FirTypeSpecificityComparatorProvider>,
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/FirDefaultImportsProviderHolder.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/FirDefaultImportsProviderHolder.kt
index db37e39..c1ac988 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/FirDefaultImportsProviderHolder.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/FirDefaultImportsProviderHolder.kt
@@ -7,7 +7,6 @@
 
 import org.jetbrains.kotlin.fir.FirComposableSessionComponent
 import org.jetbrains.kotlin.fir.FirSession
-import org.jetbrains.kotlin.fir.FirSessionComponent
 import org.jetbrains.kotlin.fir.SessionConfiguration
 import org.jetbrains.kotlin.resolve.DefaultImportsProvider
 
@@ -18,7 +17,8 @@
         }
     }
 
-    class Single(override val provider: DefaultImportsProvider) : FirDefaultImportsProviderHolder()
+    class Single(override val provider: DefaultImportsProvider) : FirDefaultImportsProviderHolder(),
+        FirComposableSessionComponent.Single<FirDefaultImportsProviderHolder>
 
     class Composed(
         override val components: List<FirDefaultImportsProviderHolder>
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/FirPlatformClassMapper.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/FirPlatformClassMapper.kt
index 8187084..e684435 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/FirPlatformClassMapper.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/FirPlatformClassMapper.kt
@@ -15,7 +15,7 @@
 
 abstract class FirPlatformClassMapper : FirComposableSessionComponent<FirPlatformClassMapper> {
     @NoMutableState
-    object Default : FirPlatformClassMapper() {
+    object Default : FirPlatformClassMapper(), FirComposableSessionComponent.Single<FirPlatformClassMapper> {
         override fun getCorrespondingPlatformClass(declaration: FirClassLikeDeclaration): FirRegularClass? {
             return null
         }
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirDelegatedMemberScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirDelegatedMemberScope.kt
index 5532e44..46e3385 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirDelegatedMemberScope.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirDelegatedMemberScope.kt
@@ -271,7 +271,7 @@
 abstract class FirDelegatedMembersFilter : FirComposableSessionComponent<FirDelegatedMembersFilter> {
     abstract fun shouldNotGenerateDelegatedMember(memberSymbolFromSuperInterface: FirCallableSymbol<*>): Boolean
 
-    object Default : FirDelegatedMembersFilter() {
+    object Default : FirDelegatedMembersFilter(), FirComposableSessionComponent.Single<FirDelegatedMembersFilter> {
         override fun shouldNotGenerateDelegatedMember(memberSymbolFromSuperInterface: FirCallableSymbol<*>): Boolean {
             return false
         }
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirEnumEntriesSupport.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirEnumEntriesSupport.kt
index d2bf865..8a9f8b5 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirEnumEntriesSupport.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirEnumEntriesSupport.kt
@@ -13,7 +13,7 @@
 import org.jetbrains.kotlin.fir.resolve.providers.getRegularClassSymbolByClassId
 import org.jetbrains.kotlin.name.StandardClassIds
 
-open class FirEnumEntriesSupport(val session: FirSession) : FirComposableSessionComponent<FirEnumEntriesSupport> {
+abstract class FirEnumEntriesSupport(val session: FirSession) : FirComposableSessionComponent<FirEnumEntriesSupport> {
     protected val isEnumEntriesAvailable: Boolean by lazy {
         session.getRegularClassSymbolByClassId(StandardClassIds.EnumEntries) != null
     }
@@ -22,6 +22,8 @@
         return klass.hasEnumEntries && isEnumEntriesAvailable
     }
 
+    class Default(session: FirSession) : FirEnumEntriesSupport(session), FirComposableSessionComponent.Single<FirEnumEntriesSupport>
+
     class Composed(
         session: FirSession,
         override val components: List<FirEnumEntriesSupport>
@@ -37,7 +39,8 @@
     }
 }
 
-class FirJvmEnumEntriesSupport(session: FirSession) : FirEnumEntriesSupport(session) {
+class FirJvmEnumEntriesSupport(session: FirSession) : FirEnumEntriesSupport(session),
+    FirComposableSessionComponent.Single<FirEnumEntriesSupport> {
     // In JVM modules "entries" can be called even on enum compiled without this property.
     override fun canSynthesizeEnumEntriesFor(klass: FirClass): Boolean = isEnumEntriesAvailable
 }
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/overloads/ConeCallConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/overloads/ConeCallConflictResolver.kt
index 035af9c..03656b2 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/overloads/ConeCallConflictResolver.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/overloads/ConeCallConflictResolver.kt
@@ -46,7 +46,7 @@
 
     abstract fun createAdditionalResolvers(session: FirSession): List<ConeCallConflictResolver>
 
-    object Default : ConeCallConflictResolverFactory() {
+    object Default : ConeCallConflictResolverFactory(), FirComposableSessionComponent.Single<ConeCallConflictResolverFactory> {
         override fun createAdditionalResolvers(session: FirSession): List<ConeCallConflictResolver> {
             return emptyList()
         }
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirDeclarationNameInvalidCharsProvider.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirDeclarationNameInvalidCharsProvider.kt
index 524c1ab..e0cc822 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirDeclarationNameInvalidCharsProvider.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirDeclarationNameInvalidCharsProvider.kt
@@ -14,7 +14,8 @@
         override val invalidChars: Set<Char> = components.flatMapTo(mutableSetOf()) { it.invalidChars }
     }
 
-    class Simple(override val invalidChars: Set<Char>) : FirDeclarationNameInvalidCharsProvider()
+    class Simple(override val invalidChars: Set<Char>) : FirDeclarationNameInvalidCharsProvider(),
+        FirComposableSessionComponent.Single<FirDeclarationNameInvalidCharsProvider>
 
     @SessionConfiguration
     override fun createComposed(components: List<FirDeclarationNameInvalidCharsProvider>): Composed {
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSessionComponent.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSessionComponent.kt
index e3419f2..b1e9dfd 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSessionComponent.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSessionComponent.kt
@@ -19,22 +19,27 @@
     @SessionConfiguration
     fun compose(other: T): T {
         val components = buildList {
-            addAll(components)
-            addAll(other.components)
+            addAll(asComponentsList())
+            addAll(other.asComponentsList())
         }.distinct()
         components.singleOrNull()?.let { return it }
         @Suppress("UNCHECKED_CAST")
         return createComposed(components) as T
     }
 
-    @Suppress("UNCHECKED_CAST")
-    val components: List<T>
-        get() = listOf(this as T)
+    fun asComponentsList(): List<T>
 
     @SessionConfiguration
     fun createComposed(components: List<T>): Composed<T>
 
+    interface Single<T : FirComposableSessionComponent<T>> : FirComposableSessionComponent<T> {
+        @Suppress("UNCHECKED_CAST")
+        override fun asComponentsList(): List<T> = listOf(this as T)
+    }
+
     interface Composed<T : FirComposableSessionComponent<T>> : FirComposableSessionComponent<T> {
-        override val components: List<T>
+        val components: List<T>
+
+        override fun asComponentsList(): List<T> = components
     }
 }