[FIR] Extract FirSessionConfigurator and IncrementalCompilationContext to separated classes
With FirSessionFactory and FirJsSessionFactory
This commit is contained in:
+2
-2
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.fir.java.FirJavaFacadeForSource
|
||||
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionConfigurator
|
||||
import org.jetbrains.kotlin.load.java.createJavaClassFinder
|
||||
|
||||
@SessionConfiguration
|
||||
@@ -50,7 +50,7 @@ internal inline fun createCompositeSymbolProvider(
|
||||
@SessionConfiguration
|
||||
internal fun FirSession.registerCompilerPluginExtensions(project: Project, module: KtSourceModule) {
|
||||
val extensionProvider = project.getService(KtCompilerPluginsProvider::class.java) ?: return
|
||||
FirSessionFactory.FirSessionConfigurator(this).apply {
|
||||
FirSessionConfigurator(this).apply {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val registrars = extensionProvider.getRegisteredExtensions(
|
||||
module,
|
||||
|
||||
+3
-2
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.fir.pipeline.runResolution
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory.createSessionWithDependencies
|
||||
import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext
|
||||
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
|
||||
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
|
||||
import org.jetbrains.kotlin.fir.types.arrayElementType
|
||||
@@ -315,7 +316,7 @@ object FirKotlinToJvmBytecodeCompiler {
|
||||
|
||||
private fun CompilationContext.createComponentsForIncrementalCompilation(
|
||||
sourceScope: AbstractProjectFileSearchScope
|
||||
): FirSessionFactory.IncrementalCompilationContext? {
|
||||
): IncrementalCompilationContext? {
|
||||
if (targetIds == null || incrementalComponents == null) return null
|
||||
val directoryWithIncrementalPartsFromPreviousCompilation =
|
||||
moduleConfiguration[JVMConfigurationKeys.OUTPUT_DIRECTORY]
|
||||
@@ -329,7 +330,7 @@ object FirKotlinToJvmBytecodeCompiler {
|
||||
projectEnvironment.getPackagePartProvider(sourceScope),
|
||||
targetIds.map(incrementalComponents::getIncrementalCache)
|
||||
)
|
||||
return FirSessionFactory.IncrementalCompilationContext(emptyList(), packagePartProvider, incrementalCompilationScope)
|
||||
return IncrementalCompilationContext(emptyList(), packagePartProvider, incrementalCompilationScope)
|
||||
}
|
||||
|
||||
private fun CompilationContext.runBackend(
|
||||
|
||||
@@ -59,6 +59,7 @@ import org.jetbrains.kotlin.fir.pipeline.runCheckers
|
||||
import org.jetbrains.kotlin.fir.pipeline.runResolution
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||
import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext
|
||||
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
|
||||
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
|
||||
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
|
||||
@@ -427,7 +428,7 @@ private fun createContextForIncrementalCompilation(
|
||||
sourceScope: AbstractProjectFileSearchScope,
|
||||
previousStepsSymbolProviders: List<FirSymbolProvider>,
|
||||
incrementalExcludesScope: AbstractProjectFileSearchScope?,
|
||||
): FirSessionFactory.IncrementalCompilationContext? {
|
||||
): IncrementalCompilationContext? {
|
||||
val targetIds = compilerConfiguration.get(JVMConfigurationKeys.MODULES)?.map(::TargetId)
|
||||
val incrementalComponents = compilerConfiguration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS)
|
||||
if (targetIds == null || incrementalComponents == null) return null
|
||||
@@ -440,7 +441,7 @@ private fun createContextForIncrementalCompilation(
|
||||
}
|
||||
|
||||
return if (incrementalCompilationScope == null && previousStepsSymbolProviders.isEmpty()) null
|
||||
else FirSessionFactory.IncrementalCompilationContext(
|
||||
else IncrementalCompilationContext(
|
||||
previousStepsSymbolProviders, IncrementalPackagePartProvider(
|
||||
projectEnvironment.getPackagePartProvider(sourceScope),
|
||||
targetIds.map(incrementalComponents::getIncrementalCache)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
|
||||
+46
@@ -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,
|
||||
|
||||
+19
@@ -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?
|
||||
)
|
||||
+3
-2
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.FirAnalyzerFacade
|
||||
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
|
||||
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionConfigurator
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||
import org.jetbrains.kotlin.ir.backend.js.jsResolveLibraries
|
||||
import org.jetbrains.kotlin.ir.backend.js.toResolverLogger
|
||||
@@ -59,7 +60,7 @@ class FirFrontendFacade(
|
||||
// Separate constructor is needed for creating callable references to it
|
||||
constructor(testServices: TestServices) : this(testServices, additionalSessionConfiguration = null)
|
||||
|
||||
fun interface SessionConfiguration : (FirSessionFactory.FirSessionConfigurator) -> Unit
|
||||
fun interface SessionConfiguration : (FirSessionConfigurator) -> Unit
|
||||
|
||||
override val additionalServices: List<ServiceRegistrationData>
|
||||
get() = listOf(service(::FirModuleInfoProvider))
|
||||
@@ -89,7 +90,7 @@ class FirFrontendFacade(
|
||||
val configuration = compilerConfigurationProvider.getCompilerConfiguration(module)
|
||||
val extensionRegistrars = FirExtensionRegistrar.getInstances(project)
|
||||
|
||||
val sessionConfigurator: FirSessionFactory.FirSessionConfigurator.() -> Unit = {
|
||||
val sessionConfigurator: FirSessionConfigurator.() -> Unit = {
|
||||
if (FirDiagnosticsDirectives.WITH_EXTENDED_CHECKERS in module.directives) {
|
||||
registerExtendedCommonCheckers()
|
||||
}
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirDependenciesSymbolProv
|
||||
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper
|
||||
import org.jetbrains.kotlin.fir.session.FirAbstractSessionFactory
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionConfigurator
|
||||
import org.jetbrains.kotlin.fir.session.KlibBasedSymbolProvider
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
+2
-1
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
||||
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionConfigurator
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -352,5 +353,5 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
|
||||
return result
|
||||
}
|
||||
|
||||
protected open fun FirSessionFactory.FirSessionConfigurator.configureSession() {}
|
||||
protected open fun FirSessionConfigurator.configureSession() {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user