HMPP, IC: Implement shared provider for IC class files
#KT-61942 fixed temporary solution, see comments for details
This commit is contained in:
committed by
Space Team
parent
76eda0095e
commit
b3d33aee19
@@ -72,6 +72,10 @@ fun <F> prepareJvmSessions(
|
||||
): List<SessionWithSources<F>> {
|
||||
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 <F> 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),
|
||||
|
||||
+58
@@ -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<FirSymbolProvider>,
|
||||
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
|
||||
)
|
||||
}
|
||||
+7
-33
@@ -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<FirExtensionRegistrar>,
|
||||
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 {
|
||||
|
||||
+1
-1
@@ -75,7 +75,7 @@ object FirSessionFactoryHelper {
|
||||
sessionProvider,
|
||||
javaSourcesScope,
|
||||
projectEnvironment,
|
||||
incrementalCompilationContext,
|
||||
{ incrementalCompilationContext?.createSymbolProviders(it, mainModuleData, projectEnvironment) },
|
||||
extensionRegistrars,
|
||||
languageVersionSettings,
|
||||
lookupTracker,
|
||||
|
||||
+1
-1
@@ -362,7 +362,7 @@ open class FirFrontendFacade(
|
||||
sessionProvider,
|
||||
PsiBasedProjectFileSearchScope(TopDownAnalyzerFacadeForJVM.newModuleSearchScope(project, ktFiles)),
|
||||
projectEnvironment!!,
|
||||
incrementalCompilationContext = null,
|
||||
createIncrementalCompilationSymbolProviders = { null },
|
||||
extensionRegistrars,
|
||||
languageVersionSettings,
|
||||
predefinedJavaComponents = predefinedJavaComponents,
|
||||
|
||||
Reference in New Issue
Block a user