[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
This commit is contained in:
Marco Pennekamp
2023-12-11 17:47:40 +01:00
committed by Space Team
parent f2cb0f1407
commit fa3da87401
10 changed files with 106 additions and 20 deletions
@@ -44,6 +44,7 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project)
firJavaFacade: FirJavaFacade,
packagePartProvider: PackagePartProvider,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider> {
return listOf(
JvmClassFileBasedSymbolProvider(
@@ -64,6 +65,7 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project)
moduleDataProvider: SingleModuleDataProvider,
packagePartProvider: PackagePartProvider,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider> {
return buildList {
add(
@@ -88,6 +90,7 @@ class LLFirStandaloneLibrarySymbolProviderFactory(private val project: Project)
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider> {
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<FirSymbolProvider> {
val kLibs = moduleData.getLibraryKLibs()
@@ -23,6 +23,7 @@ abstract class LLFirLibrarySymbolProviderFactory {
firJavaFacade: FirJavaFacade,
packagePartProvider: PackagePartProvider,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider>
abstract fun createCommonLibrarySymbolProvider(
@@ -32,6 +33,7 @@ abstract class LLFirLibrarySymbolProviderFactory {
moduleDataProvider: SingleModuleDataProvider,
packagePartProvider: PackagePartProvider,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider>
abstract fun createNativeLibrarySymbolProvider(
@@ -40,25 +42,24 @@ abstract class LLFirLibrarySymbolProviderFactory {
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider>
abstract fun createJsLibrarySymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider,
moduleDataProvider: SingleModuleDataProvider,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider>
abstract fun createBuiltinsSymbolProvider(
session: FirSession,
moduleData: LLFirModuleData,
kotlinScopeProvider: FirKotlinScopeProvider,
): List<FirSymbolProvider>
companion object {
fun getService(project: Project): LLFirLibrarySymbolProviderFactory =
project.getService(LLFirLibrarySymbolProviderFactory::class.java)
@@ -95,6 +95,7 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
project: Project,
builtinTypes: BuiltinTypes,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean = false,
): List<FirSymbolProvider>
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)
@@ -80,13 +80,20 @@ internal class LLFirCommonSessionFactory(project: Project) : LLFirAbstractSessio
project: Project,
builtinTypes: BuiltinTypes,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider> {
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,
)
)
@@ -81,10 +81,17 @@ internal class LLFirJsSessionFactory(project: Project) : LLFirAbstractSessionFac
project: Project,
builtinTypes: BuiltinTypes,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider> {
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() {
@@ -86,6 +86,7 @@ internal class LLFirJvmSessionFactory(project: Project) : LLFirAbstractSessionFa
project: Project,
builtinTypes: BuiltinTypes,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider> {
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(
@@ -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<FirSymbolProvider> {
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(
@@ -34,13 +34,23 @@ class LLStubBasedLibrarySymbolProviderFactory(private val project: Project) : LL
firJavaFacade: FirJavaFacade,
packagePartProvider: PackagePartProvider,
scope: GlobalSearchScope,
isFallbackDependenciesProvider: Boolean,
): List<FirSymbolProvider> {
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<FirSymbolProvider> = 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<FirSymbolProvider> {
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<FirSymbolProvider> {
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,
@@ -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)
@@ -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,
)
}
)