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>> {
|
): List<SessionWithSources<F>> {
|
||||||
val javaSourcesScope = projectEnvironment.getSearchScopeForProjectJavaSources()
|
val javaSourcesScope = projectEnvironment.getSearchScopeForProjectJavaSources()
|
||||||
val predefinedJavaComponents = FirSharableJavaComponents(firCachesFactoryForCliMode)
|
val predefinedJavaComponents = FirSharableJavaComponents(firCachesFactoryForCliMode)
|
||||||
|
|
||||||
|
var firJvmIncrementalCompilationSymbolProviders: FirJvmIncrementalCompilationSymbolProviders? = null
|
||||||
|
var firJvmIncrementalCompilationSymbolProvidersIsInitialized = false
|
||||||
|
|
||||||
return prepareSessions(
|
return prepareSessions(
|
||||||
files, configuration, rootModuleName, JvmPlatforms.unspecifiedJvmPlatform,
|
files, configuration, rootModuleName, JvmPlatforms.unspecifiedJvmPlatform,
|
||||||
JvmPlatformAnalyzerServices, metadataCompilationMode = false, libraryList, isCommonSource, fileBelongsToModule,
|
JvmPlatformAnalyzerServices, metadataCompilationMode = false, libraryList, isCommonSource, fileBelongsToModule,
|
||||||
@@ -88,14 +92,28 @@ fun <F> prepareJvmSessions(
|
|||||||
predefinedJavaComponents = predefinedJavaComponents,
|
predefinedJavaComponents = predefinedJavaComponents,
|
||||||
registerExtraComponents = {},
|
registerExtraComponents = {},
|
||||||
)
|
)
|
||||||
}
|
},
|
||||||
) { moduleFiles, moduleData, sessionProvider, sessionConfigurator ->
|
) { moduleFiles, moduleData, sessionProvider, sessionConfigurator ->
|
||||||
FirJvmSessionFactory.createModuleBasedSession(
|
FirJvmSessionFactory.createModuleBasedSession(
|
||||||
moduleData,
|
moduleData,
|
||||||
sessionProvider,
|
sessionProvider,
|
||||||
javaSourcesScope,
|
javaSourcesScope,
|
||||||
projectEnvironment,
|
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,
|
extensionRegistrars,
|
||||||
configuration.languageVersionSettings,
|
configuration.languageVersionSettings,
|
||||||
configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER),
|
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.FirSession
|
||||||
import org.jetbrains.kotlin.fir.SessionConfiguration
|
import org.jetbrains.kotlin.fir.SessionConfiguration
|
||||||
import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers
|
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.ModuleDataProvider
|
||||||
import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
|
|
||||||
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.java.JavaSymbolProvider
|
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
|
||||||
@@ -87,7 +85,7 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
|
|||||||
sessionProvider: FirProjectSessionProvider,
|
sessionProvider: FirProjectSessionProvider,
|
||||||
javaSourcesScope: AbstractProjectFileSearchScope,
|
javaSourcesScope: AbstractProjectFileSearchScope,
|
||||||
projectEnvironment: AbstractProjectEnvironment,
|
projectEnvironment: AbstractProjectEnvironment,
|
||||||
incrementalCompilationContext: IncrementalCompilationContext?,
|
createIncrementalCompilationSymbolProviders: (FirSession) -> FirJvmIncrementalCompilationSymbolProviders?,
|
||||||
extensionRegistrars: List<FirExtensionRegistrar>,
|
extensionRegistrars: List<FirExtensionRegistrar>,
|
||||||
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
|
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
|
||||||
lookupTracker: LookupTracker? = null,
|
lookupTracker: LookupTracker? = null,
|
||||||
@@ -114,45 +112,21 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() {
|
|||||||
},
|
},
|
||||||
registerExtraCheckers = { it.registerJvmCheckers() },
|
registerExtraCheckers = { it.registerJvmCheckers() },
|
||||||
createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) },
|
createKotlinScopeProvider = { FirKotlinScopeProvider(::wrapScopeWithJvmMapped) },
|
||||||
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
|
createProviders = { session, _, 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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val javaSymbolProvider =
|
val javaSymbolProvider =
|
||||||
JavaSymbolProvider(session, projectEnvironment.getFirJavaFacade(session, moduleData, javaSourcesScope))
|
JavaSymbolProvider(session, projectEnvironment.getFirJavaFacade(session, moduleData, javaSourcesScope))
|
||||||
session.register(JavaSymbolProvider::class, javaSymbolProvider)
|
session.register(JavaSymbolProvider::class, javaSymbolProvider)
|
||||||
|
|
||||||
|
val incrementalCompilationSymbolProviders = createIncrementalCompilationSymbolProviders(session)
|
||||||
|
|
||||||
listOfNotNull(
|
listOfNotNull(
|
||||||
symbolProvider,
|
symbolProvider,
|
||||||
*(incrementalCompilationContext?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()),
|
*(incrementalCompilationSymbolProviders?.previousFirSessionsSymbolProviders?.toTypedArray() ?: emptyArray()),
|
||||||
symbolProviderForBinariesFromIncrementalCompilation,
|
incrementalCompilationSymbolProviders?.symbolProviderForBinariesFromIncrementalCompilation,
|
||||||
generatedSymbolsProvider,
|
generatedSymbolsProvider,
|
||||||
javaSymbolProvider,
|
javaSymbolProvider,
|
||||||
*dependencies.toTypedArray(),
|
*dependencies.toTypedArray(),
|
||||||
optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation,
|
incrementalCompilationSymbolProviders?.optionalAnnotationClassesProviderForBinariesFromIncrementalCompilation,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
).also {
|
).also {
|
||||||
|
|||||||
+1
-1
@@ -75,7 +75,7 @@ object FirSessionFactoryHelper {
|
|||||||
sessionProvider,
|
sessionProvider,
|
||||||
javaSourcesScope,
|
javaSourcesScope,
|
||||||
projectEnvironment,
|
projectEnvironment,
|
||||||
incrementalCompilationContext,
|
{ incrementalCompilationContext?.createSymbolProviders(it, mainModuleData, projectEnvironment) },
|
||||||
extensionRegistrars,
|
extensionRegistrars,
|
||||||
languageVersionSettings,
|
languageVersionSettings,
|
||||||
lookupTracker,
|
lookupTracker,
|
||||||
|
|||||||
+1
-1
@@ -362,7 +362,7 @@ open class FirFrontendFacade(
|
|||||||
sessionProvider,
|
sessionProvider,
|
||||||
PsiBasedProjectFileSearchScope(TopDownAnalyzerFacadeForJVM.newModuleSearchScope(project, ktFiles)),
|
PsiBasedProjectFileSearchScope(TopDownAnalyzerFacadeForJVM.newModuleSearchScope(project, ktFiles)),
|
||||||
projectEnvironment!!,
|
projectEnvironment!!,
|
||||||
incrementalCompilationContext = null,
|
createIncrementalCompilationSymbolProviders = { null },
|
||||||
extensionRegistrars,
|
extensionRegistrars,
|
||||||
languageVersionSettings,
|
languageVersionSettings,
|
||||||
predefinedJavaComponents = predefinedJavaComponents,
|
predefinedJavaComponents = predefinedJavaComponents,
|
||||||
|
|||||||
Reference in New Issue
Block a user