[AA Platform] Add resolution scope enlarger for AA.

This allows individual extension points to register a callback to
enlarge the resolution scope of a `KaModule`. Unlike the existing
`KotlinResolutionScopeProvider`, multiple extension points can be
registered, and any resulting scopes will be unioned together.

This is designed to be the K2/AA equivalent of the K1/IDE
`KotlinResolveScopeEnlarger` extension point, allowing similar
functionality in IDE and non-IDE contexts.

^KT-73406 fixed
diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/sessions/KaGlobalSearchScope.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/sessions/KaGlobalSearchScope.kt
index 539cc02..8851fc4 100644
--- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/sessions/KaGlobalSearchScope.kt
+++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/sessions/KaGlobalSearchScope.kt
@@ -10,7 +10,7 @@
 import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.psi.search.GlobalSearchScope
 import org.jetbrains.kotlin.analysis.api.KaImplementationDetail
-import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeProvider
+import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeEnlarger
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
 import org.jetbrains.kotlin.analysis.api.projectStructure.allDirectDependencies
 import org.jetbrains.kotlin.analysis.api.projectStructure.analysisContextModule
@@ -20,8 +20,7 @@
     val shadowedScope: GlobalSearchScope,
     private val useSiteModule: KaModule,
 ) : GlobalSearchScope() {
-    val baseScope: GlobalSearchScope =
-        KotlinResolutionScopeProvider.getInstance(useSiteModule.project).getResolutionScope(useSiteModule)
+    val baseScope: GlobalSearchScope = KotlinResolutionScopeEnlarger.getEnlargedResolutionScope(useSiteModule)
 
     override fun getProject(): Project? {
         return baseScope.project
diff --git a/analysis/analysis-api-platform-interface/resources/META-INF/analysis-api/analysis-api-platform-interface.xml b/analysis/analysis-api-platform-interface/resources/META-INF/analysis-api/analysis-api-platform-interface.xml
index 623a19a..6f5368d 100644
--- a/analysis/analysis-api-platform-interface/resources/META-INF/analysis-api/analysis-api-platform-interface.xml
+++ b/analysis/analysis-api-platform-interface/resources/META-INF/analysis-api/analysis-api-platform-interface.xml
@@ -7,4 +7,13 @@
         restartRequired="true"
     />
   </extensions>
+
+  <extensionPoints>
+    <extensionPoint
+        qualifiedName="org.jetbrains.kotlin.kotlinResolutionScopeEnlarger"
+        interface="org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeEnlarger"
+        area="IDEA_PROJECT"
+        dynamic="true"
+    />
+  </extensionPoints>
 </idea-plugin>
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/projectStructure/KotlinResolutionScopeEnlarger.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/projectStructure/KotlinResolutionScopeEnlarger.kt
new file mode 100644
index 0000000..3a27f41
--- /dev/null
+++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/projectStructure/KotlinResolutionScopeEnlarger.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010-2024 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.analysis.api.platform.projectStructure
+
+import com.intellij.openapi.extensions.ExtensionPointName
+import com.intellij.openapi.project.Project
+import com.intellij.psi.search.GlobalSearchScope
+import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
+
+/**
+ * A contributor to the resolution scope provided by [KotlinResolutionScopeProvider].
+ *
+ * This allows extensions providing synthetic non-Kotlin source to bring those source files
+ * into the relevant module, library, or SDK scopes in a backend-agnostic manner. For extensions
+ * producing Kotlin source, please see the `KaResolveExtensionProvider` API.
+ */
+public interface KotlinResolutionScopeEnlarger {
+
+    public fun getAdditionalResolutionScope(module: KaModule): GlobalSearchScope?
+
+    public companion object {
+        public val EP_NAME: ExtensionPointName<KotlinResolutionScopeEnlarger> =
+            ExtensionPointName<KotlinResolutionScopeEnlarger>(
+                "org.jetbrains.kotlin.kotlinResolutionScopeEnlarger"
+            )
+
+        public fun getEnlargedResolutionScope(
+            module: KaModule,
+            project: Project = module.project,
+        ): GlobalSearchScope {
+            val baseScope =
+                KotlinResolutionScopeProvider.getInstance(project).getResolutionScope(module)
+            val additionalScopes =
+                EP_NAME.getExtensionList(project).mapNotNull {
+                    it.getAdditionalResolutionScope(module)?.takeIf { scope ->
+                        !GlobalSearchScope.isEmptyScope(scope)
+                    }
+                }
+
+            return if (additionalScopes.isNotEmpty()) {
+                KotlinGlobalSearchScopeMerger.getInstance(project)
+                    .union(listOf(baseScope) + additionalScopes)
+            } else {
+                baseScope
+            }
+        }
+    }
+}
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/projectStructure/sessionFactoryHelpers.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/projectStructure/sessionFactoryHelpers.kt
index 178d93b..a089164b 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/projectStructure/sessionFactoryHelpers.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/projectStructure/sessionFactoryHelpers.kt
@@ -9,7 +9,7 @@
 import com.intellij.openapi.util.Disposer
 import org.jetbrains.kotlin.analysis.api.platform.declarations.createAnnotationResolver
 import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinCompilerPluginsProvider
-import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeProvider
+import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinResolutionScopeEnlarger
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaSourceModule
 import org.jetbrains.kotlin.analysis.api.resolve.extensions.KaResolveExtensionProvider
 import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.FirThreadSafeCachesFactory
@@ -94,7 +94,7 @@
     project: Project,
     module: KaSourceModule
 ) {
-    val projectWithDependenciesScope = KotlinResolutionScopeProvider.getInstance(project).getResolutionScope(module)
+    val projectWithDependenciesScope = KotlinResolutionScopeEnlarger.getEnlargedResolutionScope(module, project)
     val annotationsResolver = project.createAnnotationResolver(projectWithDependenciesScope)
 
     // We need FirRegisteredPluginAnnotations and FirPredicateBasedProvider during extensions' registration process