[Analysis API Standalone] use compiler FirSymbolProvider for standalone mode

^KT-61371 fixed
This commit is contained in:
Ilya Kirillov
2023-09-13 11:41:26 +02:00
committed by Space Team
parent d377d87c77
commit b25185530f
7 changed files with 203 additions and 33 deletions
@@ -25,6 +25,32 @@ abstract class LLFirLibrarySymbolProviderFactory {
scope: GlobalSearchScope,
): List<FirSymbolProvider>
abstract fun createCommonLibrarySymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
packagePartProvider: PackagePartProvider,
scope: GlobalSearchScope,
): List<FirSymbolProvider>
abstract fun createNativeLibrarySymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
scope: GlobalSearchScope,
): List<FirSymbolProvider>
abstract fun createJsLibrarySymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
scope: GlobalSearchScope,
): List<FirSymbolProvider>
companion object {
fun getService(project: Project): LLFirLibrarySymbolProviderFactory =
project.getService(LLFirLibrarySymbolProviderFactory::class.java)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLibrarySymbolProviderFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.createStubBasedFirSymbolProviderForCommonMetadataFiles
@@ -90,8 +91,11 @@ internal class LLFirCommonSessionFactory(project: Project) : LLFirAbstractSessio
val moduleDataProvider = SingleModuleDataProvider(moduleData)
val packagePartProvider = project.createPackagePartProvider(scope)
return buildList {
add(createStubBasedFirSymbolProviderForCommonMetadataFiles(project, scope, session, moduleDataProvider, kotlinScopeProvider))
add(createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles(project, scope, session, moduleDataProvider, kotlinScopeProvider))
addAll(
LLFirLibrarySymbolProviderFactory.getService(project).createCommonLibrarySymbolProvider(
session, moduleData, kotlinScopeProvider, moduleDataProvider, packagePartProvider, scope,
)
)
addIfNotNull(
OptionalAnnotationClassesProvider.createIfNeeded(
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLibrarySymbolProviderFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
@@ -20,6 +21,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.FirPlatformDiagnosticSuppresso
import org.jetbrains.kotlin.fir.analysis.js.checkers.FirJsPlatformDiagnosticSuppressor
import org.jetbrains.kotlin.fir.analysis.jvm.FirJvmOverridesBackwardCompatibilityHelper
import org.jetbrains.kotlin.fir.declarations.FirTypeSpecificityComparatorProvider
import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
@@ -80,7 +82,9 @@ internal class LLFirJsSessionFactory(project: Project) : LLFirAbstractSessionFac
builtinTypes: BuiltinTypes,
scope: GlobalSearchScope,
): List<FirSymbolProvider> {
return emptyList() // TODO(kirpichenkov)
val moduleDataProvider = SingleModuleDataProvider(moduleData)
return LLFirLibrarySymbolProviderFactory.getService(project)
.createJsLibrarySymbolProvider(session, moduleData, kotlinScopeProvider, moduleDataProvider, scope)
}
private fun LLFirSession.registerModuleIndependentJsComponents() {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLibrarySymbolProviderFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles
@@ -82,9 +83,9 @@ internal class LLFirNativeSessionFactory(project: Project) : LLFirAbstractSessio
val moduleDataProvider = SingleModuleDataProvider(moduleData)
val packagePartProvider = project.createPackagePartProvider(scope)
return buildList {
add(
createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles(
project, scope, session, moduleDataProvider, kotlinScopeProvider
addAll(
LLFirLibrarySymbolProviderFactory.getService(project).createNativeLibrarySymbolProvider(
session, moduleData, kotlinScopeProvider, moduleDataProvider, scope
)
)
addIfNotNull(
@@ -27,7 +27,7 @@ class LLStubBasedLibrarySymbolProviderFactory(private val project: Project) : LL
moduleDataProvider: SingleModuleDataProvider,
firJavaFacade: FirJavaFacade,
packagePartProvider: PackagePartProvider,
scope: GlobalSearchScope
scope: GlobalSearchScope,
): List<FirSymbolProvider> {
return buildList {
//stub based provider here works over kotlin-only indices and thus provides only kotlin declarations
@@ -38,4 +38,47 @@ class LLStubBasedLibrarySymbolProviderFactory(private val project: Project) : LL
add(LLFirJavaSymbolProvider(session, moduleData, project, scope))
}
}
override fun createCommonLibrarySymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
packagePartProvider: PackagePartProvider,
scope: GlobalSearchScope,
): List<FirSymbolProvider> {
return buildList {
add(createStubBasedFirSymbolProviderForCommonMetadataFiles(project, scope, session, moduleDataProvider, kotlinScopeProvider))
add(
// klib metadata symbol provider
createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles(
project, scope, session, moduleDataProvider, kotlinScopeProvider
)
)
}
}
override fun createNativeLibrarySymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
scope: GlobalSearchScope,
): List<FirSymbolProvider> {
return listOf(
createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles(
project, scope, session, moduleDataProvider, kotlinScopeProvider
)
)
}
override fun createJsLibrarySymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
scope: GlobalSearchScope,
): List<FirSymbolProvider> {
return emptyList() // TODO(kirpichenkov)
}
}