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 7e2c6b2bee3..e1ae19dcbe3 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt @@ -72,6 +72,10 @@ fun prepareJvmSessions( ): List> { val javaSourcesScope = projectEnvironment.getSearchScopeForProjectJavaSources() val predefinedJavaComponents = FirSharableJavaComponents(firCachesFactoryForCliMode) + + var firJvmIncrementalCompilationSymbolProviders: FirJvmIncrementalCompilationSymbolProviders? = null + var firJvmIncrementalCompilationSymbolProvidersIsInitialized = false + return prepareSessions( files, configuration, rootModuleName, JvmPlatforms.unspecifiedJvmPlatform, JvmPlatformAnalyzerServices, metadataCompilationMode = false, libraryList, isCommonSource, fileBelongsToModule, @@ -88,14 +92,28 @@ fun prepareJvmSessions( predefinedJavaComponents = predefinedJavaComponents, registerExtraComponents = {}, ) - } + }, ) { moduleFiles, moduleData, sessionProvider, sessionConfigurator -> FirJvmSessionFactory.createModuleBasedSession( moduleData, sessionProvider, javaSourcesScope, projectEnvironment, - createProviderAndScopeForIncrementalCompilation(moduleFiles), + createIncrementalCompilationSymbolProviders = { session -> + // Temporary solution for KT-61942 - we need to share the provider built on top of previously compiled files, + // because we do not distinguish classes generated from common and platform sources, so may end up with the + // same type loaded from both. And if providers are not shared, the types will not match on the actualizing. + // The proper solution would be to build IC providers only on class files generated for the currently compiled module. + // But to solve it we need to have a mapping from module to its class files. + // TODO: reimplement with splitted providers after fixing KT-62686 + if (firJvmIncrementalCompilationSymbolProvidersIsInitialized) firJvmIncrementalCompilationSymbolProviders + else { + firJvmIncrementalCompilationSymbolProvidersIsInitialized = true + createProviderAndScopeForIncrementalCompilation(moduleFiles)?.createSymbolProviders(session, moduleData, projectEnvironment)?.also { + firJvmIncrementalCompilationSymbolProviders = it + } + } + }, extensionRegistrars, configuration.languageVersionSettings, configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER), diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmIncrementalCompilationSymbolProviders.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmIncrementalCompilationSymbolProviders.kt new file mode 100644 index 00000000000..3801b991811 --- /dev/null +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmIncrementalCompilationSymbolProviders.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.session + +import org.jetbrains.kotlin.fir.FirModuleData +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.java.deserialization.JvmClassFileBasedSymbolProvider +import org.jetbrains.kotlin.fir.java.deserialization.OptionalAnnotationClassesProvider +import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider +import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider +import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment + +data class FirJvmIncrementalCompilationSymbolProviders( + val symbolProviderForBinariesFromIncrementalCompilation: JvmClassFileBasedSymbolProvider?, + val previousFirSessionsSymbolProviders: Collection, + var optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation: OptionalAnnotationClassesProvider? = null, +) + +fun IncrementalCompilationContext.createSymbolProviders( + session: FirSession, + moduleData: FirModuleData, + projectEnvironment: AbstractProjectEnvironment, +): FirJvmIncrementalCompilationSymbolProviders { + var symbolProviderForBinariesFromIncrementalCompilation: JvmClassFileBasedSymbolProvider? = null + var optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation: OptionalAnnotationClassesProvider? = null + if (precompiledBinariesPackagePartProvider != null && precompiledBinariesFileScope != null) { + val moduleDataProvider = SingleModuleDataProvider(moduleData) + val kotlinScopeProvider = session.kotlinScopeProvider + symbolProviderForBinariesFromIncrementalCompilation = + JvmClassFileBasedSymbolProvider( + session, + moduleDataProvider, + kotlinScopeProvider, + precompiledBinariesPackagePartProvider, + projectEnvironment.getKotlinClassFinder(precompiledBinariesFileScope), + projectEnvironment.getFirJavaFacade(session, moduleData, precompiledBinariesFileScope), + defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled + ) + optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation = + OptionalAnnotationClassesProvider( + session, + moduleDataProvider, + kotlinScopeProvider, + precompiledBinariesPackagePartProvider, + defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled + ) + } + return FirJvmIncrementalCompilationSymbolProviders( + symbolProviderForBinariesFromIncrementalCompilation, + previousFirSessionsSymbolProviders, + optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation + ) +} \ No newline at end of file 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 627f6d4672a..4d473c644ea 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 @@ -11,9 +11,7 @@ import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers -import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider -import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider @@ -87,7 +85,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { sessionProvider: FirProjectSessionProvider, javaSourcesScope: AbstractProjectFileSearchScope, projectEnvironment: AbstractProjectEnvironment, - incrementalCompilationContext: IncrementalCompilationContext?, + createIncrementalCompilationSymbolProviders: (FirSession) -> FirJvmIncrementalCompilationSymbolProviders?, extensionRegistrars: List, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, lookupTracker: LookupTracker? = null, @@ -114,45 +112,21 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { }, registerExtraCheckers = { it.registerJvmCheckers() }, createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) }, - createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies -> - var symbolProviderForBinariesFromIncrementalCompilation: JvmClassFileBasedSymbolProvider? = null - var optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation: OptionalAnnotationClassesProvider? = null - incrementalCompilationContext?.let { - if (it.precompiledBinariesPackagePartProvider != null && it.precompiledBinariesFileScope != null) { - val moduleDataProvider = SingleModuleDataProvider(moduleData) - symbolProviderForBinariesFromIncrementalCompilation = - JvmClassFileBasedSymbolProvider( - session, - moduleDataProvider, - kotlinScopeProvider, - it.precompiledBinariesPackagePartProvider, - projectEnvironment.getKotlinClassFinder(it.precompiledBinariesFileScope), - projectEnvironment.getFirJavaFacade(session, moduleData, it.precompiledBinariesFileScope), - defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled - ) - optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation = - OptionalAnnotationClassesProvider( - session, - moduleDataProvider, - kotlinScopeProvider, - it.precompiledBinariesPackagePartProvider, - defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled - ) - } - } - + createProviders = { session, _, symbolProvider, generatedSymbolsProvider, dependencies -> val javaSymbolProvider = JavaSymbolProvider(session, projectEnvironment.getFirJavaFacade(session, moduleData, javaSourcesScope)) session.register(JavaSymbolProvider::class, javaSymbolProvider) + val incrementalCompilationSymbolProviders = createIncrementalCompilationSymbolProviders(session) + listOfNotNull( symbolProvider, - *(incrementalCompilationContext?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()), - symbolProviderForBinariesFromIncrementalCompilation, + *(incrementalCompilationSymbolProviders?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()), + incrementalCompilationSymbolProviders?.symbolProviderForBinariesFromIncrementalCompilation, generatedSymbolsProvider, javaSymbolProvider, *dependencies.toTypedArray(), - optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation, + incrementalCompilationSymbolProviders?.optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation, ) } ).also { diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt index 325215edf15..174af6020e8 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt @@ -75,7 +75,7 @@ object FirSessionFactoryHelper { sessionProvider, javaSourcesScope, projectEnvironment, - incrementalCompilationContext, + { incrementalCompilationContext?.createSymbolProviders(it, mainModuleData, projectEnvironment) }, extensionRegistrars, languageVersionSettings, lookupTracker, diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt index f2014967099..1743a080f2c 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt @@ -362,7 +362,7 @@ open class FirFrontendFacade( sessionProvider, PsiBasedProjectFileSearchScope(TopDownAnalyzerFacadeForJVM.newModuleSearchScope(project, ktFiles)), projectEnvironment!!, - incrementalCompilationContext = null, + createIncrementalCompilationSymbolProviders = { null }, extensionRegistrars, languageVersionSettings, predefinedJavaComponents = predefinedJavaComponents,