[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.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider 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.*
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
@@ -37,7 +37,7 @@ abstract class FirAbstractSessionFactory {
extensionRegistrars: List<FirExtensionRegistrar>, extensionRegistrars: List<FirExtensionRegistrar>,
registerExtraComponents: ((FirSession) -> Unit), registerExtraComponents: ((FirSession) -> Unit),
createKotlinScopeProvider: () -> FirKotlinScopeProvider, createKotlinScopeProvider: () -> FirKotlinScopeProvider,
createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider) -> List<FirSymbolProvider> createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider, FirExtensionSyntheticFunctionInterfaceProvider?) -> List<FirSymbolProvider>
): FirSession { ): FirSession {
return FirCliSession(sessionProvider, FirSession.Kind.Library).apply session@{ return FirCliSession(sessionProvider, FirSession.Kind.Library).apply session@{
moduleDataProvider.allModuleData.forEach { moduleDataProvider.allModuleData.forEach {
@@ -66,7 +66,9 @@ abstract class FirAbstractSessionFactory {
}.configure() }.configure()
registerCommonComponentsAfterExtensionsAreConfigured() 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) val symbolProvider = FirCachingCompositeSymbolProvider(this, providers)
register(FirSymbolProvider::class, symbolProvider) register(FirSymbolProvider::class, symbolProvider)
@@ -88,7 +90,6 @@ abstract class FirAbstractSessionFactory {
createProviders: ( createProviders: (
FirSession, FirKotlinScopeProvider, FirSymbolProvider, FirSession, FirKotlinScopeProvider, FirSymbolProvider,
FirSwitchableExtensionDeclarationsSymbolProvider?, FirSwitchableExtensionDeclarationsSymbolProvider?,
FirExtensionSyntheticFunctionInterfaceProvider?,
dependencies: List<FirSymbolProvider>, dependencies: List<FirSymbolProvider>,
) -> List<FirSymbolProvider> ) -> List<FirSymbolProvider>
): FirSession { ): FirSession {
@@ -120,15 +121,12 @@ abstract class FirAbstractSessionFactory {
val dependencyProviders = computeDependencyProviderList(moduleData) val dependencyProviders = computeDependencyProviderList(moduleData)
val generatedSymbolsProvider = FirSwitchableExtensionDeclarationsSymbolProvider.createIfNeeded(this) val generatedSymbolsProvider = FirSwitchableExtensionDeclarationsSymbolProvider.createIfNeeded(this)
val syntheticFunctionInterfaceProvider =
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(this, moduleData, kotlinScopeProvider)
val providers = createProviders( val providers = createProviders(
this, this,
kotlinScopeProvider, kotlinScopeProvider,
firProvider.symbolProvider, firProvider.symbolProvider,
generatedSymbolsProvider, generatedSymbolsProvider,
syntheticFunctionInterfaceProvider,
dependencyProviders, dependencyProviders,
) )
@@ -56,7 +56,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(it) registerExtraComponents(it)
}, },
createKotlinScopeProvider = { FirKotlinScopeProvider() }, createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, builtinsModuleData, kotlinScopeProvider -> createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
listOfNotNull( listOfNotNull(
MetadataSymbolProvider( MetadataSymbolProvider(
session, session,
@@ -73,6 +73,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
resolvedKLibs.map { it.library } resolvedKLibs.map { it.library }
) )
}, },
syntheticFunctionInterfaceProvider,
FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
) )
@@ -110,7 +111,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
}, },
registerExtraCheckers = {}, registerExtraCheckers = {},
createKotlinScopeProvider = { FirKotlinScopeProvider() }, createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, kotlinScopeProvider, symbolProvider, syntheticFunctionalInterfaceProvider, generatedSymbolsProvider, dependencies -> createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
var symbolProviderForBinariesFromIncrementalCompilation: MetadataSymbolProvider? = null var symbolProviderForBinariesFromIncrementalCompilation: MetadataSymbolProvider? = null
incrementalCompilationContext?.let { incrementalCompilationContext?.let {
val precompiledBinariesPackagePartProvider = it.precompiledBinariesPackagePartProvider val precompiledBinariesPackagePartProvider = it.precompiledBinariesPackagePartProvider
@@ -133,7 +134,6 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
*(incrementalCompilationContext?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()), *(incrementalCompilationContext?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()),
symbolProviderForBinariesFromIncrementalCompilation, symbolProviderForBinariesFromIncrementalCompilation,
generatedSymbolsProvider, generatedSymbolsProvider,
syntheticFunctionalInterfaceProvider,
*dependencies.toTypedArray(), *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.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory 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.FirBuiltinSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -54,7 +53,7 @@ object FirJsSessionFactory : FirAbstractSessionFactory() {
}, },
registerExtraCheckers = { it.registerJsCheckers() }, registerExtraCheckers = { it.registerJsCheckers() },
createKotlinScopeProvider = { FirKotlinScopeProvider() }, createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, syntheticFunctionInterfaceProvider, dependencies -> createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
listOfNotNull( listOfNotNull(
symbolProvider, symbolProvider,
generatedSymbolsProvider, generatedSymbolsProvider,
@@ -66,7 +65,6 @@ object FirJsSessionFactory : FirAbstractSessionFactory() {
it, it,
) )
}, },
syntheticFunctionInterfaceProvider,
*dependencies.toTypedArray(), *dependencies.toTypedArray(),
) )
} }
@@ -92,11 +90,11 @@ object FirJsSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(it) registerExtraComponents(it)
}, },
createKotlinScopeProvider = { FirKotlinScopeProvider() }, createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, builtinsModuleData, kotlinScopeProvider -> createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
listOfNotNull( listOfNotNull(
KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, resolvedLibraries), KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, resolvedLibraries),
FirBuiltinSyntheticFunctionInterfaceProvider(session, builtinsModuleData, kotlinScopeProvider), FirBuiltinSyntheticFunctionInterfaceProvider(session, builtinsModuleData, kotlinScopeProvider),
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(session, builtinsModuleData, kotlinScopeProvider), syntheticFunctionInterfaceProvider
) )
} }
) )
@@ -54,7 +54,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(it) registerExtraComponents(it)
}, },
createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) }, createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) },
createProviders = { session, builtinsModuleData, kotlinScopeProvider -> createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
listOfNotNull( listOfNotNull(
JvmClassFileBasedSymbolProvider( JvmClassFileBasedSymbolProvider(
session, session,
@@ -65,7 +65,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
projectEnvironment.getFirJavaFacade(session, moduleDataProvider.allModuleData.last(), scope) projectEnvironment.getFirJavaFacade(session, moduleDataProvider.allModuleData.last(), scope)
), ),
FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(session, builtinsModuleData, kotlinScopeProvider), syntheticFunctionInterfaceProvider,
FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
OptionalAnnotationClassesProvider( OptionalAnnotationClassesProvider(
session, session,
@@ -108,7 +108,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
}, },
registerExtraCheckers = { it.registerJvmCheckers() }, registerExtraCheckers = { it.registerJvmCheckers() },
createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) }, createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) },
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, syntheticFunctionInterfaceProvider, dependencies -> createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
var symbolProviderForBinariesFromIncrementalCompilation: JvmClassFileBasedSymbolProvider? = null var symbolProviderForBinariesFromIncrementalCompilation: JvmClassFileBasedSymbolProvider? = null
var optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation: OptionalAnnotationClassesProvider? = null var optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation: OptionalAnnotationClassesProvider? = null
incrementalCompilationContext?.let { incrementalCompilationContext?.let {
@@ -145,7 +145,6 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
symbolProviderForBinariesFromIncrementalCompilation, symbolProviderForBinariesFromIncrementalCompilation,
generatedSymbolsProvider, generatedSymbolsProvider,
javaSymbolProvider, javaSymbolProvider,
syntheticFunctionInterfaceProvider,
*dependencies.toTypedArray(), *dependencies.toTypedArray(),
optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation, optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation,
) )
@@ -41,7 +41,7 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(session) registerExtraComponents(session)
}, },
createKotlinScopeProvider = { FirKotlinScopeProvider() }, createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { session, builtinsModuleData, kotlinScopeProvider -> createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
val forwardDeclarationsModuleData = BinaryModuleData.createDependencyModuleData( val forwardDeclarationsModuleData = BinaryModuleData.createDependencyModuleData(
Name.special("<forward declarations>"), Name.special("<forward declarations>"),
moduleDataProvider.platform, moduleDataProvider.platform,
@@ -54,7 +54,7 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, kotlinLibraries), KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, kotlinLibraries),
NativeForwardDeclarationsSymbolProvider(session, forwardDeclarationsModuleData, kotlinScopeProvider, kotlinLibraries), NativeForwardDeclarationsSymbolProvider(session, forwardDeclarationsModuleData, kotlinScopeProvider, kotlinLibraries),
FirBuiltinSyntheticFunctionInterfaceProvider(session, builtinsModuleData, kotlinScopeProvider), FirBuiltinSyntheticFunctionInterfaceProvider(session, builtinsModuleData, kotlinScopeProvider),
FirExtensionSyntheticFunctionInterfaceProvider.createIfNeeded(session, builtinsModuleData, kotlinScopeProvider), syntheticFunctionInterfaceProvider,
) )
}) })
} }
@@ -85,11 +85,10 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() {
}, },
registerExtraCheckers = { it.registerNativeCheckers() }, registerExtraCheckers = { it.registerNativeCheckers() },
createKotlinScopeProvider = { FirKotlinScopeProvider() }, createKotlinScopeProvider = { FirKotlinScopeProvider() },
createProviders = { _, _, symbolProvider, generatedSymbolsProvider, syntheticFunctionInterfaceProvider, dependencies -> createProviders = { _, _, symbolProvider, generatedSymbolsProvider, dependencies ->
listOfNotNull( listOfNotNull(
symbolProvider, symbolProvider,
generatedSymbolsProvider, generatedSymbolsProvider,
syntheticFunctionInterfaceProvider,
*dependencies.toTypedArray(), *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.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory 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.FirBuiltinSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -52,7 +51,7 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
}, },
registerExtraCheckers = { it.registerWasmCheckers() }, registerExtraCheckers = { it.registerWasmCheckers() },
createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } }, createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } },
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, syntheticFunctionInterfaceProvider, dependencies -> createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
listOfNotNull( listOfNotNull(
symbolProvider, symbolProvider,
generatedSymbolsProvider, generatedSymbolsProvider,
@@ -64,7 +63,6 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
it, it,
) )
}, },
syntheticFunctionInterfaceProvider,
*dependencies.toTypedArray(), *dependencies.toTypedArray(),
) )
} }
@@ -90,11 +88,11 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
registerExtraComponents(it) registerExtraComponents(it)
}, },
createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } }, createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } },
createProviders = { session, builtinsModuleData, kotlinScopeProvider -> createProviders = { session, builtinsModuleData, kotlinScopeProvider, syntheticFunctionInterfaceProvider ->
listOfNotNull( listOfNotNull(
KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, resolvedLibraries), KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, resolvedLibraries),
FirBuiltinSyntheticFunctionInterfaceProvider(session, builtinsModuleData, kotlinScopeProvider), 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 * A [FirExtensionSyntheticFunctionInterfaceProvider] only needs to be created if the session's function type service has extension
* function kinds. Otherwise, the provider would be useless. * 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( fun createIfNeeded(
session: FirSession, session: FirSession,
@@ -1,5 +1,4 @@
// FIR_DISABLE_LAZY_RESOLVE_CHECKS // FIR_DISABLE_LAZY_RESOLVE_CHECKS
// IGNORE_BACKEND: JVM_IR
// LANGUAGE: +MultiPlatformProjects // LANGUAGE: +MultiPlatformProjects
// ISSUE: KT-58539 // ISSUE: KT-58539