diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt index 5d4f2b7ce3e..042fd971a9b 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt @@ -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 diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt index 5998a704142..203a9fa1790 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt @@ -37,7 +37,7 @@ abstract class FirAbstractSessionFactory { extensionRegistrars: List, registerExtraComponents: ((FirSession) -> Unit), createKotlinScopeProvider: () -> FirKotlinScopeProvider, - createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider) -> List + createProviders: (FirSession, FirModuleData, FirKotlinScopeProvider, FirExtensionSyntheticFunctionInterfaceProvider?) -> List ): 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, ) -> List ): 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, ) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt index 77bd2cd6e61..69deec96dba 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt @@ -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(), ) } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJsSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJsSessionFactory.kt index 0aefedb5764..874e4edbc57 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJsSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJsSessionFactory.kt @@ -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 ) } ) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt index f7bf69b6742..fbee8280d46 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt @@ -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, ) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirNativeSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirNativeSessionFactory.kt index 91f8f117d8e..80ab05f9784 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirNativeSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirNativeSessionFactory.kt @@ -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(""), 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(), ) } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirWasmSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirWasmSessionFactory.kt index 04205302b91..db85ba116f8 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirWasmSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirWasmSessionFactory.kt @@ -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, ) } ) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirExtensionSyntheticFunctionInterfaceProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirExtensionSyntheticFunctionInterfaceProvider.kt index 5bcd1e9cd9c..1d36b011b8b 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirExtensionSyntheticFunctionInterfaceProvider.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirExtensionSyntheticFunctionInterfaceProvider.kt @@ -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, diff --git a/plugins/fir-plugin-prototype/testData/box/expectComposableFunction.kt b/plugins/fir-plugin-prototype/testData/box/expectComposableFunction.kt index 896aebb18eb..9b8d685f204 100644 --- a/plugins/fir-plugin-prototype/testData/box/expectComposableFunction.kt +++ b/plugins/fir-plugin-prototype/testData/box/expectComposableFunction.kt @@ -1,5 +1,4 @@ // FIR_DISABLE_LAZY_RESOLVE_CHECKS -// IGNORE_BACKEND: JVM_IR // LANGUAGE: +MultiPlatformProjects // ISSUE: KT-58539