K2 KAPT: Do not run FIR compiler plugins in KAPT mode

 #KT-70651 Fixed
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt
index 021db48..d18f452 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt
@@ -61,6 +61,7 @@
     isScript: (F) -> Boolean,
     fileBelongsToModule: (F, String) -> Boolean,
     createProviderAndScopeForIncrementalCompilation: (List<F>) -> IncrementalCompilationContext?,
+    kaptMode: Boolean = false
 ): List<SessionWithSources<F>> {
     val javaSourcesScope = projectEnvironment.getSearchScopeForProjectJavaSources()
     val predefinedJavaComponents = FirSharableJavaComponents(firCachesFactoryForCliMode)
@@ -83,6 +84,7 @@
                 configuration.languageVersionSettings,
                 predefinedJavaComponents = predefinedJavaComponents,
                 registerExtraComponents = {},
+                kaptMode
             )
         },
     ) { moduleFiles, moduleData, sessionProvider, sessionConfigurator ->
@@ -116,6 +118,7 @@
             needRegisterJavaElementFinder = true,
             registerExtraComponents = {},
             sessionConfigurator,
+            kaptMode
         )
     }
 }
diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt
index 161699a..c1ebcdb 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt
@@ -86,6 +86,7 @@
         allSources: List<KtFile>,
         buildFile: File?,
         module: Module,
+        kaptMode: Boolean
     ): FirResult {
         val targetIds = compilerConfiguration.get(JVMConfigurationKeys.MODULES)?.map(::TargetId)
         val incrementalComponents = compilerConfiguration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS)
@@ -105,7 +106,7 @@
             irGenerationExtensions = IrGenerationExtension.getInstances(project)
         )
         val diagnosticsReporter = createPendingReporter(messageCollector)
-        return context.runFrontend(allSources, diagnosticsReporter, module.getModuleName(), module.getFriendPaths(), true)!!
+        return context.runFrontend(allSources, diagnosticsReporter, module.getModuleName(), module.getFriendPaths(), true, kaptMode)!!
     }
 
     fun compileModulesUsingFrontendIRAndPsi(
@@ -200,6 +201,7 @@
         rootModuleName: String,
         friendPaths: List<String>,
         ignoreErrors: Boolean = false,
+        kaptMode: Boolean = false
     ): FirResult? {
         val performanceManager = configuration.get(CLIConfigurationKeys.PERF_MANAGER)
         performanceManager?.notifyAnalysisStarted()
@@ -232,7 +234,8 @@
             isCommonSource = { it.isCommonSource == true },
             isScript = { it.isScript() },
             fileBelongsToModule = { file, moduleName -> file.hmppModuleName == moduleName },
-            createProviderAndScopeForIncrementalCompilation = { providerAndScopeForIncrementalCompilation }
+            createProviderAndScopeForIncrementalCompilation = { providerAndScopeForIncrementalCompilation },
+            kaptMode
         )
 
         val outputs = sessionsWithSources.map { (session, sources) ->
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 250cc37..3275e4e 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
@@ -96,8 +96,8 @@
 }
 
 @OptIn(SessionConfiguration::class)
-fun FirSession.registerCommonComponentsAfterExtensionsAreConfigured() {
-    register(FirFunctionTypeKindService::class, FirFunctionTypeKindServiceImpl(this))
+fun FirSession.registerCommonComponentsAfterExtensionsAreConfigured(kaptMode: Boolean = false) {
+    register(FirFunctionTypeKindService::class, FirFunctionTypeKindServiceImpl(this, kaptMode))
     register(FirProvidedDeclarationsForMetadataService::class, FirProvidedDeclarationsForMetadataService.create(this))
 }
 
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt
index 2693673..7895f18 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt
@@ -37,7 +37,8 @@
         extensionRegistrars: List<FirExtensionRegistrar>,
         registerExtraComponents: ((FirSession) -> Unit),
         createKotlinScopeProvider: () -> FirKotlinScopeProvider,
-        createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider, FirExtensionSyntheticFunctionInterfaceProvider?) -> List<FirSymbolProvider>
+        createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider, FirExtensionSyntheticFunctionInterfaceProvider?) -> List<FirSymbolProvider>,
+        kaptMode: Boolean = false,
     ): FirSession {
         return FirCliSession(sessionProvider, FirSession.Kind.Library).apply session@{
             moduleDataProvider.allModuleData.forEach {
@@ -59,11 +60,13 @@
             builtinsModuleData.bindSession(this)
 
             FirSessionConfigurator(this).apply {
-                for (extensionRegistrar in extensionRegistrars) {
-                    registerExtensions(extensionRegistrar.configure())
+                if (!kaptMode) {
+                    for (extensionRegistrar in extensionRegistrars) {
+                        registerExtensions(extensionRegistrar.configure())
+                    }
                 }
             }.configure()
-            registerCommonComponentsAfterExtensionsAreConfigured()
+            registerCommonComponentsAfterExtensionsAreConfigured(kaptMode)
 
             val syntheticFunctionInterfaceProvider =
                 FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(this, builtinsModuleData, kotlinScopeProvider)
@@ -91,7 +94,8 @@
             FirSession, FirKotlinScopeProvider, FirSymbolProvider,
             FirSwitchableExtensionDeclarationsSymbolProvider?,
             dependencies: List<FirSymbolProvider>,
-        ) -> List<FirSymbolProvider>
+        ) -> List<FirSymbolProvider>,
+        kaptMode: Boolean = false
     ): FirSession {
         return FirCliSession(sessionProvider, FirSession.Kind.Source).apply session@{
             moduleData.bindSession(this@session)
@@ -112,12 +116,14 @@
                 registerCommonCheckers()
                 registerExtraCheckers?.invoke(this)
 
-                for (extensionRegistrar in extensionRegistrars) {
-                    registerExtensions(extensionRegistrar.configure())
+                if (!kaptMode) {
+                    for (extensionRegistrar in extensionRegistrars) {
+                        registerExtensions(extensionRegistrar.configure())
+                    }
                 }
                 init()
             }.configure()
-            registerCommonComponentsAfterExtensionsAreConfigured()
+            registerCommonComponentsAfterExtensionsAreConfigured(kaptMode)
 
             val dependencyProviders = computeDependencyProviderList(moduleData)
             val generatedSymbolsProvider = FirSwitchableExtensionDeclarationsSymbolProvider.createIfNeeded(this)
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt
index b597b2e..e7de646 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt
@@ -45,6 +45,7 @@
         languageVersionSettings: LanguageVersionSettings,
         predefinedJavaComponents: FirSharableJavaComponents?,
         registerExtraComponents: ((FirSession) -> Unit),
+        kaptMode: Boolean = false,
     ): FirSession {
         val kotlinClassFinder = projectEnvironment.getKotlinClassFinder(scope)
         return createLibrarySession(
@@ -82,7 +83,8 @@
                         packagePartProvider
                     )
                 )
-            }
+            },
+            kaptMode
         )
     }
 
@@ -103,6 +105,7 @@
         needRegisterJavaElementFinder: Boolean,
         registerExtraComponents: ((FirSession) -> Unit),
         init: FirSessionConfigurator.() -> Unit,
+        kaptMode: Boolean = false
     ): FirSession {
         return createModuleBasedSession(
             moduleData,
@@ -144,7 +147,8 @@
                     *dependencies.toTypedArray(),
                     incrementalCompilationSymbolProviders?.optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation,
                 )
-            }
+            },
+            kaptMode
         ).also {
             if (needRegisterJavaElementFinder) {
                 projectEnvironment.registerAsJavaElementFinder(it)
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FirFunctionTypeKindServiceImpl.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FirFunctionTypeKindServiceImpl.kt
index c4e9844..8b9c580 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FirFunctionTypeKindServiceImpl.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FirFunctionTypeKindServiceImpl.kt
@@ -18,7 +18,7 @@
 import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
 import org.jetbrains.kotlin.name.ClassId
 
-class FirFunctionTypeKindServiceImpl(private val session: FirSession) : FirFunctionTypeKindService() {
+class FirFunctionTypeKindServiceImpl(private val session: FirSession, kaptMode: Boolean) : FirFunctionTypeKindService() {
     private val nonReflectKindsFromExtensions = mutableListOf<FunctionTypeKind>()
 
     override val extractor: FunctionTypeKindExtractor = run {
@@ -38,8 +38,10 @@
                 }
             }
 
-            for (extension in session.extensionService.functionTypeKindExtensions) {
-                with(extension) { registrar.registerKinds() }
+            if (!kaptMode) {
+                for (extension in session.extensionService.functionTypeKindExtensions) {
+                    with(extension) { registrar.registerKinds() }
+                }
             }
         }.also { kinds ->
             val allNames = kinds.map { "${it.packageFqName}.${it.classNamePrefix}" }
diff --git a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/FirKaptAnalysisHandlerExtension.kt b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/FirKaptAnalysisHandlerExtension.kt
index cd0c17d..adcce16 100644
--- a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/FirKaptAnalysisHandlerExtension.kt
+++ b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/FirKaptAnalysisHandlerExtension.kt
@@ -214,7 +214,7 @@
 
         val (analysisTime, analysisResults) = measureTimeMillis {
             val sourceFiles = getSourceFiles(disposable, projectEnvironment, configuration)
-            runFrontendForAnalysis(projectEnvironment, configuration, messageCollector, sourceFiles, null, module)
+            runFrontendForAnalysis(projectEnvironment, configuration, messageCollector, sourceFiles, null, module, true)
         }
 
         logger.info { "Initial analysis took $analysisTime ms" }
diff --git a/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/AbstractFirKotlinKaptIntegrationTestRunner.kt b/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/AbstractFirKotlinKaptIntegrationTestRunner.kt
index 82ba6ae..3c36af6 100644
--- a/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/AbstractFirKotlinKaptIntegrationTestRunner.kt
+++ b/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/AbstractFirKotlinKaptIntegrationTestRunner.kt
@@ -6,6 +6,12 @@
 package org.jetbrains.kotlin.kapt4.integration
 
 import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
+import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
+import org.jetbrains.kotlin.config.CompilerConfiguration
+import org.jetbrains.kotlin.fir.FirSession
+import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
+import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
+import org.jetbrains.kotlin.fir.extensions.FirFunctionTypeKindExtension
 import org.jetbrains.kotlin.kapt3.base.util.doOpenInternalPackagesIfRequired
 import org.jetbrains.kotlin.kapt3.test.JvmCompilerWithKaptFacade
 import org.jetbrains.kotlin.kapt3.test.KaptContextBinaryArtifact
@@ -16,7 +22,10 @@
 import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
 import org.jetbrains.kotlin.test.model.DependencyKind
 import org.jetbrains.kotlin.test.model.FrontendKinds
+import org.jetbrains.kotlin.test.model.TestModule
 import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
+import org.jetbrains.kotlin.test.services.EnvironmentConfigurator
+import org.jetbrains.kotlin.test.services.TestServices
 import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
 import org.jetbrains.kotlin.test.services.configuration.JvmEnvironmentConfigurator
 import org.jetbrains.kotlin.utils.bind
@@ -27,6 +36,7 @@
 class AbstractFirKotlinKaptIntegrationTestRunner(
     private val processorOptions: Map<String, String>,
     private val supportedAnnotations: List<String>,
+    private val additionalFirPluginExtension: ((FirSession) -> FirFunctionTypeKindExtension)?,
     private val additionalPluginExtension: IrGenerationExtension?,
     private val process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, FirKaptExtensionForTests) -> Unit
 ) : AbstractKotlinCompilerWithTargetBackendTest(TargetBackend.JVM_IR) {
@@ -50,6 +60,7 @@
             ::CommonEnvironmentConfigurator,
             ::JvmEnvironmentConfigurator,
             ::KaptEnvironmentConfigurator.bind(processorOptions),
+            { FirKaptExtensionRegistrarConfigurator(it, additionalFirPluginExtension) },
             { FirKaptIntegrationEnvironmentConfigurator(it, processorOptions, supportedAnnotations, process) }
         )
 
@@ -61,3 +72,25 @@
         useAdditionalService(::FirKaptExtensionProvider)
     }
 }
+
+class FirKaptExtensionRegistrarConfigurator(
+    testServices: TestServices,
+    private val additionalFirPluginExtension: ((FirSession) -> FirFunctionTypeKindExtension)?,
+): EnvironmentConfigurator(testServices) {
+    override fun CompilerPluginRegistrar.ExtensionStorage.registerCompilerExtensions(
+        module: TestModule,
+        configuration: CompilerConfiguration
+    ) {
+        if (additionalFirPluginExtension != null) {
+            FirExtensionRegistrarAdapter.registerExtension(FirKaptExtensionRegistrar(additionalFirPluginExtension))
+        }
+    }
+}
+
+class FirKaptExtensionRegistrar(
+    private val additionalFirPluginExtension: (FirSession) -> FirFunctionTypeKindExtension,
+): FirExtensionRegistrar() {
+    override fun ExtensionRegistrarContext.configurePlugin() {
+        +additionalFirPluginExtension
+    }
+}
\ No newline at end of file
diff --git a/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/FirKotlinKaptIntegrationTest.kt b/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/FirKotlinKaptIntegrationTest.kt
index 3f87aff..8e68945 100644
--- a/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/FirKotlinKaptIntegrationTest.kt
+++ b/plugins/kapt4/test/org/jetbrains/kotlin/kapt4/integration/FirKotlinKaptIntegrationTest.kt
@@ -9,6 +9,8 @@
 import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
 import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
 import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
+import org.jetbrains.kotlin.fir.FirSession
+import org.jetbrains.kotlin.fir.extensions.FirFunctionTypeKindExtension
 import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
 import org.jetbrains.kotlin.kapt3.javac.KaptJavaFileObject
 import org.jetbrains.kotlin.kapt3.test.integration.LoggingMessageCollector
@@ -39,12 +41,14 @@
         options: Map<String, String> = emptyMap(),
         expectFailure: Boolean = false,
         additionalPluginExtension: IrGenerationExtension? = null,
+        additionalFirPluginExtension: ((FirSession) -> FirFunctionTypeKindExtension)? = null,
         process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment, FirKaptExtensionForTests) -> Unit
     ) {
         val file = File(TEST_DATA_DIR, "$name.kt")
         AbstractFirKotlinKaptIntegrationTestRunner(
             options,
             supportedAnnotations.toList(),
+            additionalFirPluginExtension,
             additionalPluginExtension,
             process
         ).apply {
@@ -261,4 +265,16 @@
             }
         }
     ) { _, _, _, _ -> }
+
+    @Test
+    fun testFirExtensionIsIgnored() = test(
+        "Simple", "test.MyAnnotation",
+        additionalFirPluginExtension = {
+            object : FirFunctionTypeKindExtension(it) {
+                override fun FunctionTypeKindRegistrar.registerKinds() {
+                    fail("FIR extensions should not be run in kapt mode.")
+                }
+            }
+        }
+    ) { _, _, _, _ -> }
 }