[FIR] Extract FirSessionConfigurator and IncrementalCompilationContext to separated classes

With FirSessionFactory and FirJsSessionFactory
This commit is contained in:
Ivan Kochurkin
2022-06-23 12:55:31 +03:00
parent 94527e24e8
commit 2f56b29b3f
11 changed files with 86 additions and 61 deletions
@@ -11,27 +11,27 @@ import org.jetbrains.kotlin.fir.analysis.js.checkers.JsExpressionCheckers
import org.jetbrains.kotlin.fir.analysis.jvm.checkers.JvmDeclarationCheckers
import org.jetbrains.kotlin.fir.analysis.jvm.checkers.JvmExpressionCheckers
import org.jetbrains.kotlin.fir.analysis.jvm.checkers.JvmTypeCheckers
import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.fir.session.FirSessionConfigurator
fun FirSessionFactory.FirSessionConfigurator.registerCommonCheckers() {
fun FirSessionConfigurator.registerCommonCheckers() {
useCheckers(CommonDeclarationCheckers)
useCheckers(CommonExpressionCheckers)
useCheckers(CommonTypeCheckers)
}
fun FirSessionFactory.FirSessionConfigurator.registerExtendedCommonCheckers() {
fun FirSessionConfigurator.registerExtendedCommonCheckers() {
useCheckers(ExtendedExpressionCheckers)
useCheckers(ExtendedDeclarationCheckers)
useCheckers(ExtendedTypeCheckers)
}
fun FirSessionFactory.FirSessionConfigurator.registerJvmCheckers() {
fun FirSessionConfigurator.registerJvmCheckers() {
useCheckers(JvmDeclarationCheckers)
useCheckers(JvmExpressionCheckers)
useCheckers(JvmTypeCheckers)
}
fun FirSessionFactory.FirSessionConfigurator.registerJsCheckers() {
fun FirSessionConfigurator.registerJsCheckers() {
useCheckers(JsDeclarationCheckers)
useCheckers(JsExpressionCheckers)
}
@@ -109,7 +109,7 @@ abstract class FirAbstractSessionFactory {
val firProvider = FirProviderImpl(this, kotlinScopeProvider)
register(FirProvider::class, firProvider)
FirSessionFactory.FirSessionConfigurator(this).apply {
FirSessionConfigurator(this).apply {
registerCommonCheckers()
registerExtraCheckers?.invoke(this)
@@ -0,0 +1,46 @@
/*
* Copyright 2010-2022 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.FirSession
import org.jetbrains.kotlin.fir.SessionConfiguration
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.type.TypeCheckers
import org.jetbrains.kotlin.fir.analysis.checkersComponent
import org.jetbrains.kotlin.fir.analysis.extensions.additionalCheckers
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.extensions.registerExtensions
class FirSessionConfigurator(private val session: FirSession) {
private val registeredExtensions: MutableList<BunchOfRegisteredExtensions> = mutableListOf(BunchOfRegisteredExtensions.empty())
fun registerExtensions(extensions: BunchOfRegisteredExtensions) {
registeredExtensions += extensions
}
@OptIn(SessionConfiguration::class)
fun useCheckers(checkers: ExpressionCheckers) {
session.checkersComponent.register(checkers)
}
@OptIn(SessionConfiguration::class)
fun useCheckers(checkers: DeclarationCheckers) {
session.checkersComponent.register(checkers)
}
@OptIn(SessionConfiguration::class)
fun useCheckers(checkers: TypeCheckers) {
session.checkersComponent.register(checkers)
}
@SessionConfiguration
fun configure() {
session.extensionService.registerExtensions(registeredExtensions.reduce(BunchOfRegisteredExtensions::plus))
session.extensionService.additionalCheckers.forEach(session.checkersComponent::register)
}
}
@@ -9,23 +9,14 @@ import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.type.TypeCheckers
import org.jetbrains.kotlin.fir.analysis.checkersComponent
import org.jetbrains.kotlin.fir.analysis.extensions.additionalCheckers
import org.jetbrains.kotlin.fir.checkers.registerJvmCheckers
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.extensions.registerExtensions
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
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.resolve.providers.impl.FirBuiltinSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirDependenciesSymbolProviderImpl
@@ -42,43 +33,8 @@ import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
@OptIn(PrivateSessionConstructor::class, SessionConfiguration::class)
@OptIn(PrivateSessionConstructor::class)
object FirSessionFactory : FirAbstractSessionFactory() {
class FirSessionConfigurator(private val session: FirSession) {
private val registeredExtensions: MutableList<BunchOfRegisteredExtensions> = mutableListOf(BunchOfRegisteredExtensions.empty())
fun registerExtensions(extensions: BunchOfRegisteredExtensions) {
registeredExtensions += extensions
}
fun useCheckers(checkers: ExpressionCheckers) {
session.checkersComponent.register(checkers)
}
fun useCheckers(checkers: DeclarationCheckers) {
session.checkersComponent.register(checkers)
}
fun useCheckers(checkers: TypeCheckers) {
session.checkersComponent.register(checkers)
}
@SessionConfiguration
fun configure() {
session.extensionService.registerExtensions(registeredExtensions.reduce(BunchOfRegisteredExtensions::plus))
session.extensionService.additionalCheckers.forEach(session.checkersComponent::register)
}
}
data class IncrementalCompilationContext(
// assuming that providers here do not intersect with the one being built from precompiled binaries
// (maybe easiest way to achieve is to delete libraries
// TODO: consider passing something more abstract instead of precompiler component, in order to avoid file ops here
val previousFirSessionsSymbolProviders: Collection<FirSymbolProvider>,
val precompiledBinariesPackagePartProvider: PackagePartProvider?,
val precompiledBinariesFileScope: AbstractProjectFileSearchScope?
)
inline fun createSessionWithDependencies(
moduleName: Name,
platform: TargetPlatform,
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2022 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.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
data class IncrementalCompilationContext(
// assuming that providers here do not intersect with the one being built from precompiled binaries
// (maybe easiest way to achieve is to delete libraries
// TODO: consider passing something more abstract instead of precompiler component, in order to avoid file ops here
val previousFirSessionsSymbolProviders: Collection<FirSymbolProvider>,
val precompiledBinariesPackagePartProvider: PackagePartProvider?,
val precompiledBinariesFileScope: AbstractProjectFileSearchScope?
)