[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