diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt index 6a3e16af96f..5d45421f2b6 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt @@ -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, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt index 4f77541da94..613cf51bac2 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt @@ -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( diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt index 41333b65051..48f0399643f 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt @@ -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, 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) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt index 5567f878c99..18f373e9d59 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt @@ -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) } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt index e538bd25f99..92f3b2707a7 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt @@ -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) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionConfigurator.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionConfigurator.kt new file mode 100644 index 00000000000..b4197b36bea --- /dev/null +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionConfigurator.kt @@ -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 = 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) + } +} \ No newline at end of file diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt index 7a793335f37..21dda88a6b7 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt @@ -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 = 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, - val precompiledBinariesPackagePartProvider: PackagePartProvider?, - val precompiledBinariesFileScope: AbstractProjectFileSearchScope? - ) - inline fun createSessionWithDependencies( moduleName: Name, platform: TargetPlatform, diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/IncrementalCompilationContext.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/IncrementalCompilationContext.kt new file mode 100644 index 00000000000..8dfe51e0fad --- /dev/null +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/IncrementalCompilationContext.kt @@ -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, + val precompiledBinariesPackagePartProvider: PackagePartProvider?, + val precompiledBinariesFileScope: AbstractProjectFileSearchScope? +) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt index 9799d187adf..169e3799e0b 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt @@ -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 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() } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirJsSessionFactory.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirJsSessionFactory.kt index 1ffe08ceed4..212ba17620b 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirJsSessionFactory.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirJsSessionFactory.kt @@ -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 diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt index 9ef6f4f9e4d..a939af9cdfc 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt @@ -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() {} }