[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:
committed by
Space Team
parent
32891edc3e
commit
037572ee9f
@@ -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
|
||||
|
||||
+4
-6
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
+3
-3
@@ -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
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
+3
-4
@@ -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,
|
||||
)
|
||||
|
||||
+3
-4
@@ -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(),
|
||||
)
|
||||
}
|
||||
|
||||
+3
-5
@@ -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,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
+4
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user