FIR: Add IncrementalPackagePartsProvider usage in cli...

also refactor IncrementalPackagePartsProvider and parents to simplify
usage
This commit is contained in:
Ilya Chernikov
2021-02-02 10:34:14 +01:00
parent f8d50d585d
commit 3e458a1efb
10 changed files with 85 additions and 37 deletions
@@ -19,8 +19,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationChecker
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
import org.jetbrains.kotlin.fir.analysis.checkersComponent
import org.jetbrains.kotlin.fir.analysis.extensions.additionalCheckers
import org.jetbrains.kotlin.fir.caches.FirCachesFactory
import org.jetbrains.kotlin.fir.caches.FirThreadUnsafeCachesFactory
import org.jetbrains.kotlin.fir.checkers.registerCommonCheckers
import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
@@ -67,6 +65,8 @@ object FirSessionFactory {
sessionProvider: FirProjectSessionProvider,
scope: GlobalSearchScope,
project: Project,
additionalPackagePartProvider: PackagePartProvider? = null,
additionalScope: GlobalSearchScope? = null,
dependenciesProvider: FirSymbolProvider? = null,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
lookupTracker: LookupTracker? = null,
@@ -83,14 +83,25 @@ object FirSessionFactory {
val firProvider = FirProviderImpl(this, kotlinScopeProvider)
register(FirProvider::class, firProvider)
val deserializedJvmSymbolsProvider =
if (additionalPackagePartProvider == null) null
else {
val javaSymbolProvider = JavaSymbolProvider(this, project, additionalScope ?: scope)
makeDeserializedJvmSymbolsProvider(
project, additionalScope ?: scope, additionalPackagePartProvider, javaSymbolProvider, kotlinScopeProvider
)
}
register(
FirSymbolProvider::class,
FirCompositeSymbolProvider(
this,
listOf(
listOfNotNull(
firProvider.symbolProvider,
JavaSymbolProvider(this, project, scope),
dependenciesProvider ?: FirDependenciesSymbolProviderImpl(this)
dependenciesProvider ?: FirDependenciesSymbolProviderImpl(this),
deserializedJvmSymbolsProvider
)
) as FirSymbolProvider
)
@@ -113,12 +124,6 @@ object FirSessionFactory {
packagePartProvider: PackagePartProvider,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
): FirLibrarySession {
val javaClassFinder = JavaClassFinderImpl().apply {
this.setProjectInstance(project)
this.setScope(scope)
}
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(scope)
return FirLibrarySession(moduleInfo, sessionProvider).apply {
registerThreadUnsafeCaches()
registerCommonComponents(languageVersionSettings)
@@ -127,17 +132,14 @@ object FirSessionFactory {
val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped)
val deserializedJvmSymbolsProvider = makeDeserializedJvmSymbolsProvider(
project, scope, packagePartProvider, javaSymbolProvider, kotlinScopeProvider
)
val symbolProvider = FirCompositeSymbolProvider(
this,
listOf(
KotlinDeserializedJvmSymbolsProvider(
this, project,
packagePartProvider,
javaSymbolProvider,
kotlinClassFinder,
javaClassFinder,
kotlinScopeProvider
),
deserializedJvmSymbolsProvider,
FirBuiltinSymbolProvider(this, kotlinScopeProvider),
FirCloneableSymbolProvider(this, kotlinScopeProvider),
javaSymbolProvider,
@@ -149,6 +151,25 @@ object FirSessionFactory {
}
}
private fun FirSession.makeDeserializedJvmSymbolsProvider(
project: Project,
scope: GlobalSearchScope,
packagePartProvider: PackagePartProvider,
javaSymbolProvider: JavaSymbolProvider,
kotlinScopeProvider: KotlinScopeProvider
): KotlinDeserializedJvmSymbolsProvider {
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(scope)
val javaClassFinder = JavaClassFinderImpl().apply {
this.setProjectInstance(project)
this.setScope(scope)
}
return KotlinDeserializedJvmSymbolsProvider(
this, project, packagePartProvider, javaSymbolProvider, kotlinClassFinder, javaClassFinder, kotlinScopeProvider
)
}
@TestOnly
fun createEmptySession(): FirSession {
return object : FirSession(null) {}
@@ -26,7 +26,8 @@ fun createSessionWithDependencies(
sourceScope: GlobalSearchScope,
librariesScope: GlobalSearchScope,
lookupTracker: LookupTracker?,
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
getPackagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
getAdditionalModulePackagePartProvider: (GlobalSearchScope) -> PackagePartProvider?,
sessionConfigurator: FirSessionFactory.FirSessionConfigurator.() -> Unit = {}
): FirSession {
return createSessionWithDependencies(
@@ -36,7 +37,8 @@ fun createSessionWithDependencies(
sourceScope,
librariesScope,
lookupTracker,
packagePartProvider,
getPackagePartProvider,
getAdditionalModulePackagePartProvider,
sessionConfigurator
) {
FirJvmModuleInfo(name, it, friendPaths, outputDirectory)
@@ -50,7 +52,8 @@ fun createSessionWithDependencies(
sourceScope: GlobalSearchScope,
librariesScope: GlobalSearchScope,
lookupTracker: LookupTracker?,
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
getPackagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
getAdditionalModulePackagePartProvider: (GlobalSearchScope) -> PackagePartProvider?,
sessionConfigurator: FirSessionFactory.FirSessionConfigurator.() -> Unit = {}
): FirSession {
return createSessionWithDependencies(
@@ -60,7 +63,8 @@ fun createSessionWithDependencies(
sourceScope,
librariesScope,
lookupTracker,
packagePartProvider,
getPackagePartProvider,
getAdditionalModulePackagePartProvider,
sessionConfigurator
) {
FirJvmModuleInfo(module, it)
@@ -74,7 +78,8 @@ private inline fun createSessionWithDependencies(
sourceScope: GlobalSearchScope,
librariesScope: GlobalSearchScope,
lookupTracker: LookupTracker?,
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
getPackagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
getAdditionalModulePackagePartProvider: (GlobalSearchScope) -> PackagePartProvider?,
noinline sessionConfigurator: FirSessionFactory.FirSessionConfigurator.() -> Unit,
moduleInfoProvider: (dependencies: List<ModuleInfo>) -> ModuleInfo,
): FirSession {
@@ -82,13 +87,15 @@ private inline fun createSessionWithDependencies(
val librariesModuleInfo = FirJvmModuleInfo.createForLibraries(moduleName)
FirSessionFactory.createLibrarySession(
librariesModuleInfo, provider, librariesScope,
project, packagePartProvider(librariesScope)
project, getPackagePartProvider(librariesScope)
)
return FirSessionFactory.createJavaModuleBasedSession(
moduleInfoProvider(listOf(librariesModuleInfo)),
provider,
sourceScope,
project,
additionalPackagePartProvider = getAdditionalModulePackagePartProvider(sourceScope),
additionalScope = librariesScope,
languageVersionSettings = languageVersionSettings,
lookupTracker = lookupTracker,
init = sessionConfigurator