From fa3da8740117784eb90c779da9dc9ffe21fb5c3a Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Mon, 11 Dec 2023 17:47:40 +0100 Subject: [PATCH] [LL] Fix rest library symbol providers computing the wrong package sets - See KT-63718 for a detailed description of the issue. This fix is a workaround (see KT-64236). - It's worth mentioning that it's too expensive to compute package sets for "all libraries except one". Package sets are just an optimization. ^KT-63718 fixed --- ...rStandaloneLibrarySymbolProviderFactory.kt | 4 +++ .../LLFirLibrarySymbolProviderFactory.kt | 7 ++-- .../sessions/LLFirAbstractSessionFactory.kt | 10 ++++-- .../fir/sessions/LLFirCommonSessionFactory.kt | 9 ++++- .../api/fir/sessions/LLFirJsSessionFactory.kt | 11 +++++-- .../fir/sessions/LLFirJvmSessionFactory.kt | 4 ++- .../fir/sessions/LLFirNativeSessionFactory.kt | 9 +++-- ...LLStubBasedLibrarySymbolProviderFactory.kt | 31 +++++++++++++++-- .../StubBasedFirDeserializedSymbolProvider.kt | 8 ++++- .../StubBasedFirSymbolProviderFactories.kt | 33 ++++++++++++++++--- 10 files changed, 106 insertions(+), 20 deletions(-) diff --git a/analysis/analysis-api-standalone/analysis-api-fir-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/LLFirStandaloneLibrarySymbolProviderFactory.kt b/analysis/analysis-api-standalone/analysis-api-fir-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/LLFirStandaloneLibrarySymbolProviderFactory.kt index 803ef6dfe0a..69caa99e22d 100644 --- a/analysis/analysis-api-standalone/analysis-api-fir-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/LLFirStandaloneLibrarySymbolProviderFactory.kt +++ b/analysis/analysis-api-standalone/analysis-api-fir-standalone-base/src/org/jetbrains/kotlin/analysis/api/standalone/base/project/structure/LLFirStandaloneLibrarySymbolProviderFactory.kt @@ -44,6 +44,7 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project) firJavaFacade: FirJavaFacade, packagePartProvider: PackagePartProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { return listOf( JvmClassFileBasedSymbolProvider( @@ -64,6 +65,7 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project) moduleDataProvider: SingleModuleDataProvider, packagePartProvider: PackagePartProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { return buildList { add( @@ -88,6 +90,7 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project) kotlinScopeProvider: FirKotlinScopeProvider, moduleDataProvider: SingleModuleDataProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { val forwardDeclarationsModuleData = BinaryModuleData.createDependencyModuleData( FORWARD_DECLARATIONS_MODULE_NAME, @@ -109,6 +112,7 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project) kotlinScopeProvider: FirKotlinScopeProvider, moduleDataProvider: SingleModuleDataProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { val kLibs = moduleData.getLibraryKLibs() diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirLibrarySymbolProviderFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirLibrarySymbolProviderFactory.kt index 16f02f731ea..9939b097e14 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirLibrarySymbolProviderFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirLibrarySymbolProviderFactory.kt @@ -23,6 +23,7 @@ abstract class LLFirLibrarySymbolProviderFactory { firJavaFacade: FirJavaFacade, packagePartProvider: PackagePartProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List abstract fun createCommonLibrarySymbolProvider( @@ -32,6 +33,7 @@ abstract class LLFirLibrarySymbolProviderFactory { moduleDataProvider: SingleModuleDataProvider, packagePartProvider: PackagePartProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List abstract fun createNativeLibrarySymbolProvider( @@ -40,25 +42,24 @@ abstract class LLFirLibrarySymbolProviderFactory { kotlinScopeProvider: FirKotlinScopeProvider, moduleDataProvider: SingleModuleDataProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List - abstract fun createJsLibrarySymbolProvider( session: FirSession, moduleData: LLFirModuleData, kotlinScopeProvider: FirKotlinScopeProvider, moduleDataProvider: SingleModuleDataProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List - abstract fun createBuiltinsSymbolProvider( session: FirSession, moduleData: LLFirModuleData, kotlinScopeProvider: FirKotlinScopeProvider, ): List - companion object { fun getService(project: Project): LLFirLibrarySymbolProviderFactory = project.getService(LLFirLibrarySymbolProviderFactory::class.java) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt index c794d8819f8..5c4cca973f7 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt @@ -95,6 +95,7 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje project: Project, builtinTypes: BuiltinTypes, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean = false, ): List fun createScriptSession(module: KtScriptModule): LLFirScriptSession { @@ -386,8 +387,13 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje .intersectWith(GlobalSearchScope.notScope(libraryModule.contentScope)) val restLibrariesProvider = createProjectLibraryProvidersForScope( - session, moduleData, scopeProvider, - project, builtinTypes, librariesSearchScope + session, + moduleData, + scopeProvider, + project, + builtinTypes, + librariesSearchScope, + isFallbackDependenciesProvider = true, ) addAll(restLibrariesProvider) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt index 56f823bf012..f2b6d5ff743 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirCommonSessionFactory.kt @@ -80,13 +80,20 @@ internal class LLFirCommonSessionFactory(project: Project) : LLFirAbstractSessio project: Project, builtinTypes: BuiltinTypes, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { val moduleDataProvider = SingleModuleDataProvider(moduleData) val packagePartProvider = project.createPackagePartProvider(scope) return buildList { addAll( LLFirLibrarySymbolProviderFactory.getService(project).createCommonLibrarySymbolProvider( - session, moduleData, kotlinScopeProvider, moduleDataProvider, packagePartProvider, scope, + session, + moduleData, + kotlinScopeProvider, + moduleDataProvider, + packagePartProvider, + scope, + isFallbackDependenciesProvider, ) ) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt index 49cec0418c7..4264e709caf 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJsSessionFactory.kt @@ -81,10 +81,17 @@ internal class LLFirJsSessionFactory(project: Project) : LLFirAbstractSessionFac project: Project, builtinTypes: BuiltinTypes, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { val moduleDataProvider = SingleModuleDataProvider(moduleData) - return LLFirLibrarySymbolProviderFactory.getService(project) - .createJsLibrarySymbolProvider(session, moduleData, kotlinScopeProvider, moduleDataProvider, scope) + return LLFirLibrarySymbolProviderFactory.getService(project).createJsLibrarySymbolProvider( + session, + moduleData, + kotlinScopeProvider, + moduleDataProvider, + scope, + isFallbackDependenciesProvider, + ) } private fun LLFirSession.registerModuleIndependentJsComponents() { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt index 1c6a3987165..1f38262f46f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirJvmSessionFactory.kt @@ -86,6 +86,7 @@ internal class LLFirJvmSessionFactory(project: Project) : LLFirAbstractSessionFa project: Project, builtinTypes: BuiltinTypes, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { val moduleDataProvider = SingleModuleDataProvider(moduleData) val packagePartProvider = project.createPackagePartProvider(scope) @@ -100,7 +101,8 @@ internal class LLFirJvmSessionFactory(project: Project) : LLFirAbstractSessionFa moduleDataProvider, firJavaFacade, packagePartProvider, - scope + scope, + isFallbackDependenciesProvider, ) ) addIfNotNull( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt index a27cf92a1bb..7a41b7088b9 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirNativeSessionFactory.kt @@ -10,7 +10,6 @@ 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 import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule @@ -79,13 +78,19 @@ internal class LLFirNativeSessionFactory(project: Project) : LLFirAbstractSessio project: Project, builtinTypes: BuiltinTypes, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { val moduleDataProvider = SingleModuleDataProvider(moduleData) val packagePartProvider = project.createPackagePartProvider(scope) return buildList { addAll( LLFirLibrarySymbolProviderFactory.getService(project).createNativeLibrarySymbolProvider( - session, moduleData, kotlinScopeProvider, moduleDataProvider, scope + session, + moduleData, + kotlinScopeProvider, + moduleDataProvider, + scope, + isFallbackDependenciesProvider, ) ) addIfNotNull( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/LLStubBasedLibrarySymbolProviderFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/LLStubBasedLibrarySymbolProviderFactory.kt index db25890bc7a..dbd49efa70a 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/LLStubBasedLibrarySymbolProviderFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/LLStubBasedLibrarySymbolProviderFactory.kt @@ -34,13 +34,23 @@ class LLStubBasedLibrarySymbolProviderFactory(private val project: Project) : LL firJavaFacade: FirJavaFacade, packagePartProvider: PackagePartProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { return buildList { //stub based provider here works over kotlin-only indices and thus provides only kotlin declarations //in order to find java declarations, one need to explicitly setup java symbol provider. //for ProtoBuf based provider (used in compiler), there is no need in separated java provider, //because all declarations are retrieved at once and are not distinguished - add(createStubBasedFirSymbolProviderForClassFiles(project, scope, session, moduleDataProvider, kotlinScopeProvider)) + add( + createStubBasedFirSymbolProviderForClassFiles( + project, + scope, + session, + moduleDataProvider, + kotlinScopeProvider, + isFallbackDependenciesProvider, + ) + ) add(LLFirJavaSymbolProvider(session, moduleData, project, scope)) } } @@ -52,6 +62,7 @@ class LLStubBasedLibrarySymbolProviderFactory(private val project: Project) : LL moduleDataProvider: SingleModuleDataProvider, packagePartProvider: PackagePartProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List = listOf( createStubBasedFirSymbolProviderForCommonMetadataFiles( project = project, @@ -59,6 +70,7 @@ class LLStubBasedLibrarySymbolProviderFactory(private val project: Project) : LL session = session, moduleDataProvider = moduleDataProvider, kotlinScopeProvider = kotlinScopeProvider, + isFallbackDependenciesProvider = isFallbackDependenciesProvider, ) ) @@ -68,10 +80,16 @@ class LLStubBasedLibrarySymbolProviderFactory(private val project: Project) : LL kotlinScopeProvider: FirKotlinScopeProvider, moduleDataProvider: SingleModuleDataProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { return listOf( createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles( - project, scope, session, moduleDataProvider, kotlinScopeProvider + project, + scope, + session, + moduleDataProvider, + kotlinScopeProvider, + isFallbackDependenciesProvider, ) ) } @@ -82,10 +100,16 @@ class LLStubBasedLibrarySymbolProviderFactory(private val project: Project) : LL kotlinScopeProvider: FirKotlinScopeProvider, moduleDataProvider: SingleModuleDataProvider, scope: GlobalSearchScope, + isFallbackDependenciesProvider: Boolean, ): List { return listOf( createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles( - project, scope, session, moduleDataProvider, kotlinScopeProvider + project, + scope, + session, + moduleDataProvider, + kotlinScopeProvider, + isFallbackDependenciesProvider, ), ) } @@ -112,6 +136,7 @@ private class StubBasedBuiltInsSymbolProvider( kotlinScopeProvider, project, createBuiltInsScope(project), + isFallbackDependenciesProvider = false, ) { private val syntheticFunctionInterfaceProvider = FirBuiltinSyntheticFunctionInterfaceProvider( session, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt index 0bfc5f631bf..a065dc35167 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt @@ -54,10 +54,16 @@ internal open class StubBasedFirDeserializedSymbolProvider( private val kotlinScopeProvider: FirKotlinScopeProvider, project: Project, scope: GlobalSearchScope, + + // A workaround for KT-63718. It should be removed with KT-64236. + isFallbackDependenciesProvider: Boolean, ) : LLFirKotlinSymbolProvider(session) { private val moduleData = moduleDataProvider.getModuleData(null) - final override val declarationProvider = project.createDeclarationProvider(scope, session.llFirModuleData.ktModule) + final override val declarationProvider = project.createDeclarationProvider( + scope, + contextualModule = session.llFirModuleData.ktModule.takeIf { !isFallbackDependenciesProvider }, + ) override val symbolNamesProvider: FirSymbolNamesProvider = LLFirKotlinSymbolNamesProvider.cached(session, declarationProvider) 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 68a51de2668..79154a98429 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,7 +11,6 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.DelegatingGlobalSearchScope import com.intellij.psi.search.GlobalSearchScope 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.scopes.FirKotlinScopeProvider @@ -25,8 +24,14 @@ internal fun createStubBasedFirSymbolProviderForClassFiles( session: FirSession, moduleDataProvider: SingleModuleDataProvider, kotlinScopeProvider: FirKotlinScopeProvider, + isFallbackDependenciesProvider: Boolean, ): FirSymbolProvider = createStubBasedFirSymbolProviderForScopeLimitedByFiles( - project, baseScope, session, moduleDataProvider, kotlinScopeProvider, + project, + baseScope, + session, + moduleDataProvider, + kotlinScopeProvider, + isFallbackDependenciesProvider, fileFilter = { file -> val extension = file.extension extension == JavaClassFileType.INSTANCE.defaultExtension || extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION @@ -39,8 +44,14 @@ internal fun createStubBasedFirSymbolProviderForCommonMetadataFiles( session: FirSession, moduleDataProvider: SingleModuleDataProvider, kotlinScopeProvider: FirKotlinScopeProvider, + isFallbackDependenciesProvider: Boolean, ): FirSymbolProvider = createStubBasedFirSymbolProviderForScopeLimitedByFiles( - project, baseScope, session, moduleDataProvider, kotlinScopeProvider, + project, + baseScope, + session, + moduleDataProvider, + kotlinScopeProvider, + isFallbackDependenciesProvider, fileFilter = { file -> val extension = file.extension extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION || @@ -56,8 +67,14 @@ internal fun createStubBasedFirSymbolProviderForKotlinNativeMetadataFiles( session: FirSession, moduleDataProvider: SingleModuleDataProvider, kotlinScopeProvider: FirKotlinScopeProvider, + isFallbackDependenciesProvider: Boolean, ): FirSymbolProvider = createStubBasedFirSymbolProviderForScopeLimitedByFiles( - project, baseScope, session, moduleDataProvider, kotlinScopeProvider, + project, + baseScope, + session, + moduleDataProvider, + kotlinScopeProvider, + isFallbackDependenciesProvider, fileFilter = { file -> file.extension == KLIB_METADATA_FILE_EXTENSION }, ) @@ -67,13 +84,19 @@ internal fun createStubBasedFirSymbolProviderForScopeLimitedByFiles( session: FirSession, moduleDataProvider: SingleModuleDataProvider, kotlinScopeProvider: FirKotlinScopeProvider, + isFallbackDependenciesProvider: Boolean, fileFilter: (VirtualFile) -> Boolean, ): StubBasedFirDeserializedSymbolProvider { return createFirSymbolProviderForScopeLimitedByFiles( project, baseScope, fileFilter, symbolProviderFactory = { reducedScope: GlobalSearchScope -> StubBasedFirDeserializedSymbolProvider( - session, moduleDataProvider, kotlinScopeProvider, project, reducedScope, + session, + moduleDataProvider, + kotlinScopeProvider, + project, + reducedScope, + isFallbackDependenciesProvider, ) } )