AA: drop ProjectStructureProvider#getKtBinaryModules
Instead, provide an option to register PSI declaration provider inside
Analysis API session builder where we can retrieve all necessary pieces,
including CoreJarFileSystem, PackagePartProvider, and binary modules
from internal project structure provider.
diff --git a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/KtStaticModuleProvider.kt b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/KtStaticModuleProvider.kt
index 397094b..56c8b5b 100644
--- a/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/KtStaticModuleProvider.kt
+++ b/analysis/analysis-api-standalone/analysis-api-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/KtStaticModuleProvider.kt
@@ -7,11 +7,10 @@
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.project.structure.*
-import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.psi.psiUtil.contains
class KtStaticModuleProvider(
- private val projectStructure: KtModuleProjectStructure,
+ val projectStructure: KtModuleProjectStructure,
) : ProjectStructureProvider() {
override fun getKtModuleForKtElement(element: PsiElement): KtModule {
return projectStructure.mainModules
@@ -19,8 +18,4 @@
module.ktModule.contentScope.contains(element)
}.ktModule
}
-
- override fun getKtBinaryModules(): Collection<KtBinaryModule> {
- return projectStructure.allKtModules().filterIsInstance<KtBinaryModule>()
- }
}
\ No newline at end of file
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
index cdeb204..1ec6726 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt
@@ -9,6 +9,7 @@
import com.intellij.openapi.application.Application
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
+import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.impl.PsiElementFinderImpl
import com.intellij.psi.search.GlobalSearchScope
@@ -33,14 +34,8 @@
import org.jetbrains.kotlin.analysis.project.structure.impl.buildKtModuleProviderByCompilerConfiguration
import org.jetbrains.kotlin.analysis.project.structure.impl.getPsiFilesFromPaths
import org.jetbrains.kotlin.analysis.project.structure.impl.getSourceFilePaths
-import org.jetbrains.kotlin.analysis.providers.KotlinAnnotationsResolverFactory
-import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProviderFactory
-import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory
-import org.jetbrains.kotlin.analysis.providers.KotlinPackageProviderFactory
-import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticAnnotationsResolverFactory
-import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticDeclarationProviderFactory
-import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticModificationTrackerFactory
-import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticPackageProviderFactory
+import org.jetbrains.kotlin.analysis.providers.*
+import org.jetbrains.kotlin.analysis.providers.impl.*
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
@@ -167,6 +162,23 @@
PsiElementFinder.EP.getPoint(project).registerExtension(PsiElementFinderImpl(project))
}
+ private fun registerPsiDeclarationFromBinaryModuleProvider(
+ packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
+ ) {
+ val ktModuleProviderImpl = projectStructureProvider as KtModuleProviderImpl
+ kotlinCoreProjectEnvironment.project.apply {
+ registerService(
+ KotlinPsiDeclarationProviderFactory::class.java,
+ KotlinStaticPsiDeclarationProviderFactory(
+ this,
+ packagePartProvider,
+ ktModuleProviderImpl.binaryModules,
+ kotlinCoreProjectEnvironment.environment.jarFileSystem as CoreJarFileSystem
+ )
+ )
+ }
+ }
+
public fun <T : Any> registerProjectService(serviceInterface: Class<T>, serviceImplementation: T) {
kotlinCoreProjectEnvironment.project.apply {
registerService(serviceInterface, serviceImplementation)
@@ -179,7 +191,9 @@
}
}
- public fun build(): StandaloneAnalysisAPISession {
+ public fun build(
+ withPsiDeclarationFromBinaryModuleProvider: Boolean = false,
+ ): StandaloneAnalysisAPISession {
val ktModuleProviderImpl = projectStructureProvider as KtModuleProviderImpl
val modules = ktModuleProviderImpl.mainModules
val allSourceFiles = ktModuleProviderImpl.allSourceFiles()
@@ -204,6 +218,9 @@
ktFiles,
createPackagePartProvider,
)
+ if (withPsiDeclarationFromBinaryModuleProvider) {
+ registerPsiDeclarationFromBinaryModuleProvider(createPackagePartProvider)
+ }
return StandaloneAnalysisAPISession(
kotlinCoreProjectEnvironment,
@@ -216,6 +233,7 @@
public inline fun buildStandaloneAnalysisAPISession(
applicationDisposable: Disposable = Disposer.newDisposable("StandaloneAnalysisAPISession.application"),
projectDisposable: Disposable = Disposer.newDisposable("StandaloneAnalysisAPISession.project"),
+ withPsiDeclarationFromBinaryModuleProvider: Boolean = false,
init: StandaloneAnalysisAPISessionBuilder.() -> Unit
): StandaloneAnalysisAPISession {
contract {
@@ -224,5 +242,7 @@
return StandaloneAnalysisAPISessionBuilder(
applicationDisposable,
projectDisposable,
- ).apply(init).build()
+ ).apply(init).build(
+ withPsiDeclarationFromBinaryModuleProvider,
+ )
}
diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleProviderImpl.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleProviderImpl.kt
index 33ecee8..8a427878 100644
--- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleProviderImpl.kt
+++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtModuleProviderImpl.kt
@@ -43,16 +43,12 @@
}
}
- private val binaryModules: Collection<KtBinaryModule> by lazy {
+ internal val binaryModules: List<KtBinaryModule> by lazy {
mainModules
.flatMap { it.allDirectDependencies() }
.filterIsInstance<KtBinaryModule>()
}
- override fun getKtBinaryModules(): Collection<KtBinaryModule> {
- return binaryModules
- }
-
internal fun allSourceFiles(): List<PsiFileSystemItem> = buildList {
val files = mainModules.mapNotNull { (it as? KtSourceModuleImpl)?.sourceRoots }.flatten()
addAll(files)
diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeTestServiceRegistrar.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeTestServiceRegistrar.kt
index f300d10..191f838 100644
--- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeTestServiceRegistrar.kt
+++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeTestServiceRegistrar.kt
@@ -8,8 +8,10 @@
import com.intellij.mock.MockApplication
import com.intellij.mock.MockProject
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
+import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticModuleProvider
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.decompiled.light.classes.ClsJavaStubByVirtualFileCache
+import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
import org.jetbrains.kotlin.analysis.providers.KotlinPsiDeclarationProviderFactory
import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticPsiDeclarationProviderFactory
@@ -23,7 +25,9 @@
override fun registerProjectServices(project: MockProject, testServices: TestServices) {
val projectStructureProvider = project.getService(ProjectStructureProvider::class.java)
- val binaryModules = projectStructureProvider.getKtBinaryModules().toList()
+ val binaryModules =
+ (projectStructureProvider as? KtStaticModuleProvider)?.projectStructure?.allKtModules()?.filterIsInstance<KtBinaryModule>()
+ ?: emptyList()
val projectEnvironment = testServices.environmentManager.getProjectEnvironment()
val binaryRoots = StandaloneProjectFactory.getAllBinaryRoots(binaryModules, projectEnvironment)
project.apply {
diff --git a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/ProjectStructureProvider.kt b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/ProjectStructureProvider.kt
index 6ec742a..19a4740 100644
--- a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/ProjectStructureProvider.kt
+++ b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/ProjectStructureProvider.kt
@@ -7,19 +7,12 @@
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
-import org.jetbrains.kotlin.platform.TargetPlatform
public abstract class ProjectStructureProvider {
/**
* For a given [PsiElement] get a [KtModule] to which [PsiElement] belongs.
*/
public abstract fun getKtModuleForKtElement(element: PsiElement): KtModule
-
- /**
- * Returns all dependent [KtBinaryModule]s in this project.
- */
- // TODO: We rather need a session or facade that maintains this information.
- public abstract fun getKtBinaryModules(): Collection<KtBinaryModule>
}
/**