[FIR] Create FirExtensionSyntheticFunctionInterfaceProvider only once for all sessions

This is needed to avoid duplication of symbols for the same classIds

^KT-58539 Fixed
This commit is contained in:
Dmitriy Novozhilov
2023-07-06 11:05:46 +03:00
committed by Space Team
parent 32891edc3e
commit 037572ee9f
9 changed files with 24 additions and 28 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.session.*
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
@@ -37,7 +37,7 @@ abstract class FirAbstractSessionFactory {
extensionRegistrars: List<FirExtensionRegistrar>,
registerExtraComponents: ((FirSession) -> Unit),
createKotlinScopeProvider: () -> FirKotlinScopeProvider,
createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider) -> List<FirSymbolProvider>
createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider, FirExtensionSyntheticFunctionInterfaceProvider?) -> List<FirSymbolProvider>
): FirSession {
return FirCliSession(sessionProvider, FirSession.Kind.Library).apply session@{
moduleDataProvider.allModuleData.forEach {
@@ -66,7 +66,9 @@ abstract class FirAbstractSessionFactory {
}.configure()
registerCommonComponentsAfterExtensionsAreConfigured()
val providers = createProviders(this, builtinsModuleData, kotlinScopeProvider)
val syntheticFunctionInterfaceProvider =
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(this, builtinsModuleData, kotlinScopeProvider)
val providers = createProviders(this, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider)
val symbolProvider = FirCachingCompositeSymbolProvider(this, providers)
register(FirSymbolProvider::class, symbolProvider)
@@ -88,7 +90,6 @@ abstract class FirAbstractSessionFactory {
createProviders: (
FirSession, FirKotlinScopeProvider, FirSymbolProvider,
FirSwitchableExtensionDeclarationsSymbolProvider?,
FirExtensionSyntheticFunctionInterfaceProvider?,
dependencies: List<FirSymbolProvider>,
) -> List<FirSymbolProvider>
): FirSession {
@@ -120,15 +121,12 @@ abstract class FirAbstractSessionFactory {
val dependencyProviders = computeDependencyProviderList(moduleData)
val generatedSymbolsProvider = FirSwitchableExtensionDeclarationsSymbolProvider.createIfNeeded(this)
val syntheticFunctionInterfaceProvider =
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(this, moduleData, kotlinScopeProvider)
val providers = createProviders(
this,
kotlinScopeProvider,
firProvider.symbolProvider,
generatedSymbolsProvider,
syntheticFunctionInterfaceProvider,
dependencyProviders,
)
@@ -56,7 +56,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(it)
},
createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, builtinsModuleData, kotlinScopeProvider ->
createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
listOfNotNull(
MetadataSymbolProvider(
session,
@@ -73,6 +73,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
resolvedKLibs.map { it.library }
)
},
syntheticFunctionInterfaceProvider,
FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
)
@@ -110,7 +111,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
},
registerExtraCheckers = {},
createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, kotlinScopeProvider, symbolProvider, syntheticFunctionalInterfaceProvider, generatedSymbolsProvider, dependencies ->
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
var symbolProviderForBinariesFromIncrementalCompilation: MetadataSymbolProvider? = null
incrementalCompilationContext?.let {
val precompiledBinariesPackagePartProvider = it.precompiledBinariesPackagePartProvider
@@ -133,7 +134,6 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
*(incrementalCompilationContext?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()),
symbolProviderForBinariesFromIncrementalCompilation,
generatedSymbolsProvider,
syntheticFunctionalInterfaceProvider,
*dependencies.toTypedArray(),
)
}
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper
import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -54,7 +53,7 @@ object FirJsSessionFactory : FirAbstractSessionFactory() {
},
registerExtraCheckers = { it.registerJsCheckers() },
createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, syntheticFunctionInterfaceProvider, dependencies ->
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
listOfNotNull(
symbolProvider,
generatedSymbolsProvider,
@@ -66,7 +65,6 @@ object FirJsSessionFactory : FirAbstractSessionFactory() {
it,
)
},
syntheticFunctionInterfaceProvider,
*dependencies.toTypedArray(),
)
}
@@ -92,11 +90,11 @@ object FirJsSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(it)
},
createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, builtinsModuleData, kotlinScopeProvider ->
createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
listOfNotNull(
KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, resolvedLibraries),
FirBuiltinSyntheticFunctionInterfaceProvider(session, builtinsModuleData, kotlinScopeProvider),
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(session, builtinsModuleData, kotlinScopeProvider),
syntheticFunctionInterfaceProvider
)
}
)
@@ -54,7 +54,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(it)
},
createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) },
createProviders = { session, builtinsModuleData, kotlinScopeProvider ->
createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
listOfNotNull(
JvmClassFileBasedSymbolProvider(
session,
@@ -65,7 +65,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
projectEnvironment.getFirJavaFacade(session, moduleDataProvider.allModuleData.last(), scope)
),
FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(session, builtinsModuleData, kotlinScopeProvider),
syntheticFunctionInterfaceProvider,
FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
OptionalAnnotationClassesProvider(
session,
@@ -108,7 +108,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
},
registerExtraCheckers = { it.registerJvmCheckers() },
createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) },
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, syntheticFunctionInterfaceProvider, dependencies ->
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
var symbolProviderForBinariesFromIncrementalCompilation: JvmClassFileBasedSymbolProvider? = null
var optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation: OptionalAnnotationClassesProvider? = null
incrementalCompilationContext?.let {
@@ -145,7 +145,6 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
symbolProviderForBinariesFromIncrementalCompilation,
generatedSymbolsProvider,
javaSymbolProvider,
syntheticFunctionInterfaceProvider,
*dependencies.toTypedArray(),
optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation,
)
@@ -41,7 +41,7 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(session)
},
createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, builtinsModuleData, kotlinScopeProvider ->
createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
val forwardDeclarationsModuleData = BinaryModuleData.createDependencyModuleData(
Name.special("<forward declarations>"),
moduleDataProvider.platform,
@@ -54,7 +54,7 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, kotlinLibraries),
NativeForwardDeclarationsSymbolProvider(session, forwardDeclarationsModuleData, kotlinScopeProvider, kotlinLibraries),
FirBuiltinSyntheticFunctionInterfaceProvider(session, builtinsModuleData, kotlinScopeProvider),
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(session, builtinsModuleData, kotlinScopeProvider),
syntheticFunctionInterfaceProvider,
)
})
}
@@ -85,11 +85,10 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
},
registerExtraCheckers = { it.registerNativeCheckers() },
createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { _, _, symbolProvider, generatedSymbolsProvider, syntheticFunctionInterfaceProvider, dependencies ->
createProviders = { _, _, symbolProvider, generatedSymbolsProvider, dependencies ->
listOfNotNull(
symbolProvider,
generatedSymbolsProvider,
syntheticFunctionInterfaceProvider,
*dependencies.toTypedArray(),
)
}
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper
import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -52,7 +51,7 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
},
registerExtraCheckers = { it.registerWasmCheckers() },
createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } },
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, syntheticFunctionInterfaceProvider, dependencies ->
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
listOfNotNull(
symbolProvider,
generatedSymbolsProvider,
@@ -64,7 +63,6 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
it,
)
},
syntheticFunctionInterfaceProvider,
*dependencies.toTypedArray(),
)
}
@@ -90,11 +88,11 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(it)
},
createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } },
createProviders = { session, builtinsModuleData, kotlinScopeProvider ->
createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
listOfNotNull(
KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, resolvedLibraries),
FirBuiltinSyntheticFunctionInterfaceProvider(session, builtinsModuleData, kotlinScopeProvider),
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(session, builtinsModuleData, kotlinScopeProvider),
syntheticFunctionInterfaceProvider,
)
}
)
@@ -49,6 +49,10 @@ class FirExtensionSyntheticFunctionInterfaceProvider(
/**
* A [FirExtensionSyntheticFunctionInterfaceProvider] only needs to be created if the session's function type service has extension
* function kinds. Otherwise, the provider would be useless.
*
* Important note: this provider should be created once per compiled set of modules, so all sessions will share the same provider
* Otherwise it may lead to the situation when there are two different symbols for the same classId, which may trigger
* errors during expect/actual matching
*/
fun createIfNeeded(
session: FirSession,
@@ -1,5 +1,4 @@
// FIR_DISABLE_LAZY_RESOLVE_CHECKS
// IGNORE_BACKEND: JVM_IR
// LANGUAGE: +MultiPlatformProjects
// ISSUE: KT-58539