Use registered FIR compiler extensions in Analysis API.

This will allow IDE plugins to contribute compiler plugins to analysis,
above and beyond those used for the actual compilation step. These
plugins can be used to, for example, provide declarations for code that
is generated during build by an external tool.

^KT-57763 fixed
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt
index a8b1e57..fab1ceb 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt
@@ -54,13 +54,10 @@
 internal fun FirSession.registerCompilerPluginExtensions(project: Project, module: KtSourceModule) {
     val extensionProvider = project.getService(KtCompilerPluginsProvider::class.java) ?: return
     FirSessionConfigurator(this).apply {
-        @Suppress("UNCHECKED_CAST")
-        val registrars = extensionProvider.getRegisteredExtensions(
-            module,
-            FirExtensionRegistrarAdapter,
-        ) as List<FirExtensionRegistrar>
+        val registrars = FirExtensionRegistrarAdapter.getInstances(project) +
+                extensionProvider.getRegisteredExtensions(module, FirExtensionRegistrarAdapter)
         for (extensionRegistrar in registrars) {
-            registerExtensions(extensionRegistrar.configure())
+            registerExtensions((extensionRegistrar as FirExtensionRegistrar).configure())
         }
     }.configure()
 }
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/NoOpKtCompilerPluginsProvider.kt
similarity index 74%
rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt
rename to analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/NoOpKtCompilerPluginsProvider.kt
index 6f7de0d..802cc49 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/NoOpKtCompilerPluginsProvider.kt
@@ -5,13 +5,11 @@
 
 package org.jetbrains.kotlin.analysis.low.level.api.fir.services
 
-import com.intellij.openapi.project.Project
 import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
 import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
 import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
 
-internal class KtCompilerPluginsProviderForTests(val project: Project) : KtCompilerPluginsProvider() {
-    override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> {
-        return extensionType.getInstances(project)
-    }
+internal object NoOpKtCompilerPluginsProvider : KtCompilerPluginsProvider() {
+    override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> =
+        emptyList()
 }
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt
index 9cb1398..e3199f9b 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt
@@ -17,7 +17,7 @@
 import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirResolveSessionService
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory
 import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirBuiltinsSessionFactory
-import org.jetbrains.kotlin.analysis.low.level.api.fir.services.KtCompilerPluginsProviderForTests
+import org.jetbrains.kotlin.analysis.low.level.api.fir.services.NoOpKtCompilerPluginsProvider
 import org.jetbrains.kotlin.analysis.low.level.api.fir.services.LLFirSealedClassInheritorsProcessorFactoryForTests
 import org.jetbrains.kotlin.analysis.low.level.api.fir.services.PackagePartProviderTestImpl
 import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionCache
@@ -56,7 +56,7 @@
             registerService(PackagePartProviderFactory::class.java, PackagePartProviderTestImpl(testServices))
 
             registerService(KotlinAsJavaSupport::class.java, SymbolKotlinAsJavaSupport(project))
-            registerService(KtCompilerPluginsProvider::class.java, KtCompilerPluginsProviderForTests(project))
+            registerService(KtCompilerPluginsProvider::class.java, NoOpKtCompilerPluginsProvider)
             registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerFirImpl())
             registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java)
         }
diff --git a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt
index a453e25..4ec1ce8 100644
--- a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt
+++ b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt
@@ -13,6 +13,8 @@
 public abstract class KtCompilerPluginsProvider {
     /**
      * Returns a list of extensions of a base [extensionType] which are registered for [module]
+     *
+     * These extensions are used in addition to those provided by the extension descriptor's [ProjectExtensionDescriptor.getInstances].
      */
     public abstract fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T>
 }