[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:
committed by
Space Team
parent
f2cb0f1407
commit
fa3da87401
+4
@@ -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()
|
||||
|
||||
|
||||
+4
-3
@@ -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)
|
||||
|
||||
+8
-2
@@ -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)
|
||||
|
||||
+8
-1
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
+9
-2
@@ -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() {
|
||||
|
||||
+3
-1
@@ -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(
|
||||
|
||||
+7
-2
@@ -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(
|
||||
|
||||
+28
-3
@@ -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,
|
||||
|
||||
+7
-1
@@ -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)
|
||||
|
||||
|
||||
+28
-5
@@ -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,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user