From c94c5a7d58031c78e8321b76d9576d467446c78e Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Thu, 20 Jul 2023 19:13:59 +0300 Subject: [PATCH] [LL] Unify stub-based built-ins fir symbol provider with the rest --- .../structure/LLFirBuiltinsSessionFactory.kt | 34 +---------------- .../StubBasedFirSymbolProviderFactories.kt | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt index 7716e3c859e..ce311b15080 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt @@ -15,7 +15,7 @@ import com.intellij.psi.util.CachedValuesManager import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirBuiltinsAndCloneableSessionProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirBuiltinsAndCloneableSession -import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.StubBasedFirDeserializedSymbolProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.createStubBasedFirSymbolProviderForBuiltins import org.jetbrains.kotlin.analysis.project.structure.KtBuiltinsModule import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices @@ -98,28 +98,7 @@ class LLFirBuiltinsSessionFactory(private val project: Project) { register(FirKotlinScopeProvider::class, kotlinScopeProvider) val symbolProvider = createCompositeSymbolProvider(this) { - val moduleDataProvider = SingleModuleDataProvider(moduleData) - add( - object : StubBasedFirDeserializedSymbolProvider( - session, - moduleDataProvider, - kotlinScopeProvider, - project, - BuiltinsGlobalSearchScope(project), - FirDeclarationOrigin.BuiltIns - ) { - private val syntheticFunctionInterfaceProvider = FirBuiltinSyntheticFunctionInterfaceProvider( - session, - moduleData, - kotlinScopeProvider - ) - - override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? { - return super.getClassLikeSymbolByClassId(classId) - ?: syntheticFunctionInterfaceProvider.getClassLikeSymbolByClassId(classId) - } - } - ) + add(createStubBasedFirSymbolProviderForBuiltins(project, session, moduleData, kotlinScopeProvider)) add(FirExtensionSyntheticFunctionInterfaceProvider(session, moduleData, kotlinScopeProvider)) add(FirCloneableSymbolProvider(session, moduleData, kotlinScopeProvider)) } @@ -136,15 +115,6 @@ class LLFirBuiltinsSessionFactory(private val project: Project) { } } -internal class BuiltinsGlobalSearchScope(project: Project) : DelegatingGlobalSearchScope(project, allScope(project)) { - override fun contains(file: VirtualFile): Boolean { - if (file.extension != BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) { - return false - } - return super.contains(file) - } -} - private fun TargetPlatform.getAnalyzerServices() = when { isJvm() -> JvmPlatformAnalyzerServices isJs() -> JvmPlatformAnalyzerServices/*TODO*/ diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirSymbolProviderFactories.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirSymbolProviderFactories.kt index 6b1c4378993..747d828c822 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirSymbolProviderFactories.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirSymbolProviderFactories.kt @@ -11,12 +11,17 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.DelegatingGlobalSearchScope import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.decompiler.psi.KotlinBuiltInFileType +import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSyntheticFunctionInterfaceProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.library.KLIB_METADATA_FILE_EXTENSION +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol internal fun createStubBasedFirSymbolProviderForClassFiles( project: Project, @@ -51,6 +56,39 @@ internal fun createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles( fileFilter = { file -> file.extension == KLIB_METADATA_FILE_EXTENSION }, ) +internal fun createStubBasedFirSymbolProviderForBuiltins( + project: Project, + session: FirSession, + moduleData: LLFirModuleData, + kotlinScopeProvider: FirKotlinScopeProvider, +): StubBasedFirDeserializedSymbolProvider { + return createFirSymbolProviderForScopeLimitedByFiles( + project, DelegatingGlobalSearchScope.allScope(project), + fileFilter = { file -> file.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION }, + symbolProviderFactory = { reducedScope: GlobalSearchScope -> + object : StubBasedFirDeserializedSymbolProvider( + session, + SingleModuleDataProvider(moduleData), + kotlinScopeProvider, + project, + reducedScope, + FirDeclarationOrigin.BuiltIns + ) { + private val syntheticFunctionInterfaceProvider = FirBuiltinSyntheticFunctionInterfaceProvider( + session, + moduleData, + kotlinScopeProvider + ) + + override fun getClassLikeSymbolByClassId(classId: ClassId): FirClassLikeSymbol<*>? { + return super.getClassLikeSymbolByClassId(classId) + ?: syntheticFunctionInterfaceProvider.getClassLikeSymbolByClassId(classId) + } + } + } + ) +} + internal fun createStubBasedFirSymbolProviderForScopeLimitedByFiles( project: Project, baseScope: GlobalSearchScope,