From 6db8c2829100deba7e11558046a90c1bce48158b Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 28 Aug 2020 17:35:23 +0300 Subject: [PATCH] [FIR] Refactor session components initialization From now all customization of session should perform via DSL which declared in FirSessionFactory. Registration or mutation session services from other places is prohibited --- .../compiler/KotlinToJVMBytecodeCompiler.kt | 15 +++--- .../kotlin/fir/analysis/CheckersComponent.kt | 13 ++--- .../expression/DefaultExpressionCheckers.kt | 17 ------ .../collectors/FirDiagnosticsCollector.kt | 11 +--- .../kotlin/fir/checkers/CheckersContainers.kt | 20 +++++++ .../checkers/CommonDeclarationCheckers.kt} | 11 ++-- .../fir/checkers/CommonExpressionCheckers.kt | 25 +++++++++ .../fir/session/ComponentsContainers.kt | 52 +++++++------------ .../kotlin/fir/session/FirSessionFactory.kt | 43 +++++++++++++-- .../fir/java/FirJavaVisibilityChecker.kt | 4 -- .../fir/FirJvmEffectiveVisibilityResolver.kt | 4 -- .../kotlin/fir/resolve/FirJavaClassMapper.kt | 4 -- .../resolve/FirJavaSyntheticNamesProvider.kt | 4 -- .../jvm/JvmCallConflictResolverFactory.kt | 5 -- .../fir/extensions/FirExtensionRegistrar.kt | 7 +++ .../org/jetbrains/kotlin/fir/FirSession.kt | 4 ++ .../fir/AbstractExtendedFirDiagnosticsTest.kt | 12 ++--- ...ExtendedFirWithLightTreeDiagnosticsTest.kt | 12 ++--- .../fir/AbstractFirBaseDiagnosticsTest.kt | 21 ++++---- .../jetbrains/kotlin/fir/SessionTestUtils.kt | 4 -- .../api/sessions/FirIdeLibrarySession.kt | 2 + .../api/sessions/FirIdeSourcesSession.kt | 3 +- .../api/AbstractFirMultiModuleResolveTest.kt | 7 +-- .../AbstractFirAllOpenDiagnosticTest.kt | 7 ++- 24 files changed, 158 insertions(+), 149 deletions(-) create mode 100644 compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt rename compiler/fir/{checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DefaultDeclarationCheckers.kt => entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt} (92%) create mode 100644 compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonExpressionCheckers.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index 2dfb1b5053a..d25405d60b6 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -64,15 +64,12 @@ import org.jetbrains.kotlin.fir.backend.jvm.FirJvmClassCodegen import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter import org.jetbrains.kotlin.fir.builder.RawFirBuilder -import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions -import org.jetbrains.kotlin.fir.extensions.extensionService -import org.jetbrains.kotlin.fir.extensions.registerExtensions +import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor import org.jetbrains.kotlin.fir.session.FirSessionFactory -import org.jetbrains.kotlin.fir.session.registerExtendedCheckersComponent import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.ir.backend.jvm.jvmResolveLibraries import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmManglerDesc @@ -353,7 +350,11 @@ object KotlinToJVMBytecodeCompiler { } val moduleInfo = FirJvmModuleInfo(module.getModuleName()) - val session: FirSession = FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, scope).also { + val session: FirSession = FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, scope) { + if (extendedAnalysisMode) { + registerExtendedCommonCheckers() + } + }.also { val dependenciesInfo = FirJvmModuleInfo(Name.special("")) moduleInfo.dependencies.add(dependenciesInfo) val librariesScope = ProjectScope.getLibrariesScope(project) @@ -361,10 +362,6 @@ object KotlinToJVMBytecodeCompiler { dependenciesInfo, provider, librariesScope, project, environment.createPackagePartProvider(librariesScope) ) - it.extensionService.registerExtensions(BunchOfRegisteredExtensions.empty()) - if (extendedAnalysisMode) { - it.registerExtendedCheckersComponent() - } } val firProvider = (session.firProvider as FirProviderImpl) val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, stubMode = false) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt index 4b36714694f..7323f664ff6 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionComponent +import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker import org.jetbrains.kotlin.fir.analysis.checkers.declaration.* @@ -14,29 +15,23 @@ import org.jetbrains.kotlin.fir.analysis.checkers.expression.* import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension class CheckersComponent : FirSessionComponent { - companion object { - fun componentWithDefaultCheckers(): CheckersComponent { - return CheckersComponent().apply { - register(CommonDeclarationCheckers) - register(CommonExpressionCheckers) - } - } - } - val declarationCheckers: DeclarationCheckers get() = _declarationCheckers private val _declarationCheckers = ComposedDeclarationCheckers() val expressionCheckers: ExpressionCheckers get() = _expressionCheckers private val _expressionCheckers = ComposedExpressionCheckers() + @SessionConfiguration fun register(checkers: DeclarationCheckers) { _declarationCheckers.register(checkers) } + @SessionConfiguration fun register(checkers: ExpressionCheckers) { _expressionCheckers.register(checkers) } + @SessionConfiguration fun register(checkers: FirAdditionalCheckersExtension) { register(checkers.declarationCheckers) register(checkers.expressionCheckers) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/DefaultExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/DefaultExpressionCheckers.kt index f574c816508..5237217f8e9 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/DefaultExpressionCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/DefaultExpressionCheckers.kt @@ -5,20 +5,3 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression -import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirSealedClassConstructorCallChecker - -object CommonExpressionCheckers : ExpressionCheckers() { - override val expressionCheckers: List = listOf() - override val qualifiedAccessCheckers: List = listOf( - FirSuperNotAvailableChecker, - FirNotASupertypeChecker, - FirSuperclassNotAccessibleFromInterfaceChecker, - FirAbstractSuperCallChecker, - FirQualifiedSupertypeExtendedByOtherSupertypeChecker, - FirProjectionsOnNonClassTypeArgumentChecker, - FirUpperBoundViolatedChecker, - FirTypeArgumentsNotAllowedExpressionChecker, - FirSealedClassConstructorCallChecker, - ) - override val functionCallCheckers: List = listOf() -} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/FirDiagnosticsCollector.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/FirDiagnosticsCollector.kt index 9c654dca277..1c54834632d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/FirDiagnosticsCollector.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/FirDiagnosticsCollector.kt @@ -6,13 +6,9 @@ package org.jetbrains.kotlin.fir.analysis.collectors import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.analysis.checkersComponent -import org.jetbrains.kotlin.fir.analysis.extensions.additionalCheckers -import org.jetbrains.kotlin.fir.extensions.extensionService object FirDiagnosticsCollector { fun create(session: FirSession): AbstractDiagnosticCollector { - session.registerAdditionalCheckers() val collector = SimpleDiagnosticsCollector(session) collector.registerAllComponents() return collector @@ -21,13 +17,8 @@ object FirDiagnosticsCollector { // Use in CLI compiler @Suppress("unused") fun createParallel(session: FirSession): AbstractDiagnosticCollector { - session.registerAdditionalCheckers() val collector = ParallelDiagnosticsCollector(session, numberOfThreads = 4) collector.registerAllComponents() return collector } - - private fun FirSession.registerAdditionalCheckers() { - extensionService.additionalCheckers.forEach(checkersComponent::register) - } -} \ No newline at end of file +} 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 new file mode 100644 index 00000000000..ae20a89a6d6 --- /dev/null +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2020 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.checkers + +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.ExtendedDeclarationCheckers +import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExtendedExpressionCheckers +import org.jetbrains.kotlin.fir.session.FirSessionFactory + +fun FirSessionFactory.FirSessionConfigurator.registerCommonCheckers() { + useCheckers(CommonDeclarationCheckers) + useCheckers(CommonExpressionCheckers) +} + +fun FirSessionFactory.FirSessionConfigurator.registerExtendedCommonCheckers() { + useCheckers(ExtendedExpressionCheckers) + useCheckers(ExtendedDeclarationCheckers) +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DefaultDeclarationCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt similarity index 92% rename from compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DefaultDeclarationCheckers.kt rename to compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt index 6557eb8677b..17be0cdb51b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DefaultDeclarationCheckers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt @@ -3,18 +3,17 @@ * 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.analysis.checkers.declaration +package org.jetbrains.kotlin.fir.checkers import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker import org.jetbrains.kotlin.fir.analysis.cfa.FirCallsEffectAnalyzer import org.jetbrains.kotlin.fir.analysis.cfa.FirPropertyInitializationAnalyzer import org.jetbrains.kotlin.fir.analysis.cfa.FirReturnsImpliesAnalyzer import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.* object CommonDeclarationCheckers : DeclarationCheckers() { - override val fileCheckers: List = listOf( - - ) + override val fileCheckers: List = listOf() override val declarationCheckers: List = listOf( FirAnnotationClassDeclarationChecker, @@ -27,7 +26,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirConflictingProjectionChecker, ) - override val memberDeclarationCheckers: List =listOf( + override val memberDeclarationCheckers: List = listOf( FirInfixFunctionDeclarationChecker, FirExposedVisibilityDeclarationChecker, FirCommonConstructorDelegationIssuesChecker, @@ -59,4 +58,4 @@ object CommonDeclarationCheckers : DeclarationCheckers() { override val variableAssignmentCfaBasedCheckers: List = listOf( FirPropertyInitializationAnalyzer ) -} \ No newline at end of file +} diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonExpressionCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonExpressionCheckers.kt new file mode 100644 index 00000000000..14a8c926890 --- /dev/null +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonExpressionCheckers.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2020 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.checkers + +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirSealedClassConstructorCallChecker +import org.jetbrains.kotlin.fir.analysis.checkers.expression.* + +object CommonExpressionCheckers : ExpressionCheckers() { + override val expressionCheckers: List = listOf() + override val qualifiedAccessCheckers: List = listOf( + FirSuperNotAvailableChecker, + FirNotASupertypeChecker, + FirSuperclassNotAccessibleFromInterfaceChecker, + FirAbstractSuperCallChecker, + FirQualifiedSupertypeExtendedByOtherSupertypeChecker, + FirProjectionsOnNonClassTypeArgumentChecker, + FirUpperBoundViolatedChecker, + FirTypeArgumentsNotAllowedExpressionChecker, + FirSealedClassConstructorCallChecker, + ) + override val functionCallCheckers: List = listOf() +} diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt index 33f6bd978b5..5f3449eb343 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt @@ -5,30 +5,25 @@ package org.jetbrains.kotlin.fir.session -import org.jetbrains.kotlin.fir.FirModuleBasedSession -import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.CheckersComponent -import org.jetbrains.kotlin.fir.analysis.checkers.declaration.ExtendedDeclarationCheckers -import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExtendedExpressionCheckers -import org.jetbrains.kotlin.fir.analysis.checkersComponent import org.jetbrains.kotlin.fir.extensions.FirExtensionService import org.jetbrains.kotlin.fir.extensions.FirPredicateBasedProvider import org.jetbrains.kotlin.fir.extensions.FirRegisteredPluginAnnotations -import org.jetbrains.kotlin.fir.java.registerJavaVisibilityChecker -import org.jetbrains.kotlin.fir.registerJvmEffectiveVisibilityResolver -import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver -import org.jetbrains.kotlin.fir.resolve.FirTypeResolver -import org.jetbrains.kotlin.fir.resolve.calls.jvm.registerJvmCallConflictResolverFactory +import org.jetbrains.kotlin.fir.java.FirJavaVisibilityChecker +import org.jetbrains.kotlin.fir.resolve.* +import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory +import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider +import org.jetbrains.kotlin.fir.resolve.calls.jvm.JvmCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.providers.impl.FirQualifierResolverImpl import org.jetbrains.kotlin.fir.resolve.providers.impl.FirTypeResolverImpl -import org.jetbrains.kotlin.fir.resolve.registerJavaClassMapper -import org.jetbrains.kotlin.fir.resolve.registerJavaSyntheticNamesProvider import org.jetbrains.kotlin.fir.resolve.transformers.plugin.GeneratedClassIndex import org.jetbrains.kotlin.fir.scopes.impl.FirDeclaredMemberScopeProvider import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache // -------------------------- Required components -------------------------- +@OptIn(SessionConfiguration::class) fun FirSession.registerCommonComponents() { register(FirDeclaredMemberScopeProvider::class, FirDeclaredMemberScopeProvider()) register(FirCorrespondingSupertypesCache::class, FirCorrespondingSupertypesCache(this)) @@ -41,31 +36,24 @@ fun FirSession.registerCommonComponents() { // -------------------------- Resolve components -------------------------- -// TODO: rename to `registerCommonResolveComponents +/* + * Resolve components which are same on all platforms + */ +@OptIn(SessionConfiguration::class) fun FirModuleBasedSession.registerResolveComponents() { register(FirQualifierResolver::class, FirQualifierResolverImpl(this)) register(FirTypeResolver::class, FirTypeResolverImpl(this)) + register(CheckersComponent::class, CheckersComponent()) } -fun FirModuleBasedSession.registerJavaSpecificComponents() { - registerJavaVisibilityChecker() - registerJvmCallConflictResolverFactory() - registerJvmEffectiveVisibilityResolver() - registerJavaClassMapper() - registerJavaSyntheticNamesProvider() -} - -// -------------------------- Checker components -------------------------- - /* - * TODO: in future rename to `registerCheckersComponent` and configure - * exact checkers according to platforms of current session + * Resolve components which have specific implementations on JVM */ -fun FirModuleBasedSession.registerCheckersComponent() { - register(CheckersComponent::class, CheckersComponent.componentWithDefaultCheckers()) -} - -fun FirModuleBasedSession.registerExtendedCheckersComponent() { - this.checkersComponent.register(ExtendedExpressionCheckers) - this.checkersComponent.register(ExtendedDeclarationCheckers) +@OptIn(SessionConfiguration::class) +fun FirModuleBasedSession.registerJavaSpecificComponents() { + register(FirVisibilityChecker::class, FirJavaVisibilityChecker) + register(ConeCallConflictResolverFactory::class, JvmCallConflictResolverFactory) + register(FirEffectiveVisibilityResolver::class, FirJvmEffectiveVisibilityResolver(this)) + register(FirPlatformClassMapper::class, FirJavaClassMapper(this)) + register(FirSyntheticNamesProvider::class, FirJavaSyntheticNamesProvider) } 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 535047aea04..0a611228c65 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 @@ -10,8 +10,18 @@ import com.intellij.psi.PsiElementFinder import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.fir.FirModuleBasedSession import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.PrivateSessionConstructor +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.checkersComponent +import org.jetbrains.kotlin.fir.analysis.extensions.additionalCheckers +import org.jetbrains.kotlin.fir.checkers.registerCommonCheckers +import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions +import org.jetbrains.kotlin.fir.extensions.extensionService +import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.* import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider @@ -23,18 +33,40 @@ import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory -@OptIn(PrivateSessionConstructor::class) +@OptIn(PrivateSessionConstructor::class, SessionConfiguration::class) object FirSessionFactory { + class FirSessionConfigurator(private val session: FirModuleBasedSession) { + private val registeredExtensions = 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) + } + + @SessionConfiguration + fun configure() { + session.extensionService.registerExtensions(registeredExtensions.reduce(BunchOfRegisteredExtensions::plus)) + session.extensionService.additionalCheckers.forEach(session.checkersComponent::register) + } + } + fun createJavaModuleBasedSession( moduleInfo: ModuleInfo, sessionProvider: FirProjectSessionProvider, scope: GlobalSearchScope, - dependenciesProvider: FirSymbolProvider? = null + dependenciesProvider: FirSymbolProvider? = null, + init: FirSessionConfigurator.() -> Unit = {} ): FirJavaModuleBasedSession { return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply { registerCommonComponents() registerResolveComponents() - registerCheckersComponent() registerJavaSpecificComponents() val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) @@ -54,6 +86,11 @@ object FirSessionFactory { ) as FirSymbolProvider ) + FirSessionConfigurator(this).apply { + registerCommonCheckers() + init() + }.configure() + PsiElementFinder.EP.getPoint(sessionProvider.project) .registerExtension(FirJavaElementFinder(this, sessionProvider.project), sessionProvider.project) } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt index ede0388c179..a4e5c236cb8 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt @@ -42,7 +42,3 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() { } } } - -fun FirSession.registerJavaVisibilityChecker() { - register(FirVisibilityChecker::class, FirJavaVisibilityChecker) -} diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/FirJvmEffectiveVisibilityResolver.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/FirJvmEffectiveVisibilityResolver.kt index d94c173ffe1..525d0398511 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/FirJvmEffectiveVisibilityResolver.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/FirJvmEffectiveVisibilityResolver.kt @@ -15,7 +15,3 @@ class FirJvmEffectiveVisibilityResolver(session: FirSession) : FirEffectiveVisib } } } - -fun FirSession.registerJvmEffectiveVisibilityResolver() { - register(FirEffectiveVisibilityResolver::class, FirJvmEffectiveVisibilityResolver(this)) -} diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaClassMapper.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaClassMapper.kt index d886c0af0be..ca0db6b1612 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaClassMapper.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaClassMapper.kt @@ -16,7 +16,3 @@ class FirJavaClassMapper(private val session: FirSession) : FirPlatformClassMapp return javaClassId?.let { session.firSymbolProvider.getClassLikeSymbolByFqName(it)?.fir } as? FirRegularClass } } - -fun FirSession.registerJavaClassMapper() { - register(FirPlatformClassMapper::class, FirJavaClassMapper(this)) -} diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaSyntheticNamesProvider.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaSyntheticNamesProvider.kt index 19ddd5401f9..506408efad5 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaSyntheticNamesProvider.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaSyntheticNamesProvider.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.resolve -import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider import org.jetbrains.kotlin.load.java.propertyNameByGetMethodName import org.jetbrains.kotlin.name.Name @@ -41,6 +40,3 @@ object FirJavaSyntheticNamesProvider : FirSyntheticNamesProvider() { } } -fun FirSession.registerJavaSyntheticNamesProvider() { - register(FirSyntheticNamesProvider::class, FirJavaSyntheticNamesProvider) -} diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt index b991687d8a7..a9e317070ea 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.resolve.calls.jvm -import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.calls.ConeCompositeConflictResolver import org.jetbrains.kotlin.fir.resolve.calls.ConeOverloadConflictResolver @@ -25,7 +24,3 @@ object JvmCallConflictResolverFactory : ConeCallConflictResolverFactory() { ) } } - -fun FirSession.registerJvmCallConflictResolverFactory() { - register(ConeCallConflictResolverFactory::class, JvmCallConflictResolverFactory) -} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt index f140a7d94af..78786e6880d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.extensions import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.SessionConfiguration import kotlin.reflect.KClass abstract class FirExtensionRegistrar { @@ -76,8 +77,14 @@ class BunchOfRegisteredExtensions @PluginServicesInitialization constructor( return BunchOfRegisteredExtensions(extensions) } } + + @OptIn(PluginServicesInitialization::class) + operator fun plus(other: BunchOfRegisteredExtensions): BunchOfRegisteredExtensions { + return BunchOfRegisteredExtensions(extensions + other.extensions) + } } +@SessionConfiguration @OptIn(PluginServicesInitialization::class) fun FirExtensionService.registerExtensions(registeredExtensions: BunchOfRegisteredExtensions) { registeredExtensions.extensions.forEach { registerExtensions(it.kClass, it.extensionFactories) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt index 80d42c272be..af30993908c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt @@ -18,6 +18,9 @@ import kotlin.reflect.KClass @RequiresOptIn annotation class PrivateSessionConstructor +@RequiresOptIn +annotation class SessionConfiguration + interface FirSessionComponent abstract class FirSession @PrivateSessionConstructor constructor(val sessionProvider: FirSessionProvider?) : ComponentArrayOwner() { @@ -39,6 +42,7 @@ abstract class FirSession @PrivateSessionConstructor constructor(val sessionProv final override val typeRegistry: TypeRegistry = Companion + @SessionConfiguration fun register(tClass: KClass, value: FirSessionComponent) { registerComponent(tClass, value) } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractExtendedFirDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractExtendedFirDiagnosticsTest.kt index a0f9b0626b3..342e2c07234 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractExtendedFirDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractExtendedFirDiagnosticsTest.kt @@ -5,13 +5,11 @@ package org.jetbrains.kotlin.fir -import org.jetbrains.kotlin.fir.analysis.checkers.declaration.ExtendedDeclarationCheckers -import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExtendedExpressionCheckers -import org.jetbrains.kotlin.fir.analysis.checkersComponent +import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers +import org.jetbrains.kotlin.fir.session.FirSessionFactory abstract class AbstractExtendedFirDiagnosticsTest : AbstractFirDiagnosticsTest() { - override fun configureSession(session: FirSession) { - session.checkersComponent.register(ExtendedDeclarationCheckers) - session.checkersComponent.register(ExtendedExpressionCheckers) + override fun FirSessionFactory.FirSessionConfigurator.configureSession() { + registerExtendedCommonCheckers() } -} \ No newline at end of file +} diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractExtendedFirWithLightTreeDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractExtendedFirWithLightTreeDiagnosticsTest.kt index d82361018b0..1c470f159b8 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractExtendedFirWithLightTreeDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractExtendedFirWithLightTreeDiagnosticsTest.kt @@ -5,13 +5,11 @@ package org.jetbrains.kotlin.fir -import org.jetbrains.kotlin.fir.analysis.checkers.declaration.ExtendedDeclarationCheckers -import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExtendedExpressionCheckers -import org.jetbrains.kotlin.fir.analysis.checkersComponent +import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers +import org.jetbrains.kotlin.fir.session.FirSessionFactory abstract class AbstractExtendedFirWithLightTreeDiagnosticsTest : AbstractFirDiagnosticsWithLightTreeTest() { - override fun configureSession(session: FirSession) { - session.checkersComponent.register(ExtendedDeclarationCheckers) - session.checkersComponent.register(ExtendedExpressionCheckers) + override fun FirSessionFactory.FirSessionConfigurator.configureSession() { + registerExtendedCommonCheckers() } -} \ No newline at end of file +} 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 b28261d58f5..f5a8a2a7d90 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt @@ -27,9 +27,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions -import org.jetbrains.kotlin.fir.extensions.FirExtensionService -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.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.resolve.firProvider @@ -79,18 +76,18 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { FirSessionFactory.createLibrarySession( builtInsModuleInfo, sessionProvider, allProjectScope, project, environment.createPackagePartProvider(allProjectScope) - ).also { - registerFirExtensions(it.extensionService) - } + ) val configToSession = modules.mapValues { (config, info) -> val moduleFiles = groupedByModule.getValue(config) val scope = TopDownAnalyzerFacadeForJVM.newModuleSearchScope( project, moduleFiles.mapNotNull { it.ktFile }) - FirSessionFactory.createJavaModuleBasedSession(info, sessionProvider, scope).also { - registerFirExtensions(it.extensionService) - configureSession(it) + FirSessionFactory.createJavaModuleBasedSession(info, sessionProvider, scope) { + configureSession() + getFirExtensions()?.let { + registerExtensions(it) + } } } @@ -110,8 +107,8 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { runAnalysis(testDataFile, files, firFilesPerSession) } - open fun registerFirExtensions(service: FirExtensionService) { - service.registerExtensions(BunchOfRegisteredExtensions.empty()) + protected open fun getFirExtensions(): BunchOfRegisteredExtensions? { + return null } private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List, firFiles: MutableList, useLightTree: Boolean) { @@ -333,5 +330,5 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { return result } - protected open fun configureSession(session: FirSession) {} + protected open fun FirSessionFactory.FirSessionConfigurator.configureSession() {} } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/SessionTestUtils.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/SessionTestUtils.kt index 7e5218ddc48..8a120515180 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/SessionTestUtils.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/SessionTestUtils.kt @@ -8,9 +8,6 @@ package org.jetbrains.kotlin.fir import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions -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.session.FirSessionFactory import org.jetbrains.kotlin.load.kotlin.PackagePartProvider @@ -34,7 +31,6 @@ fun createSession( val provider = FirProjectSessionProvider(project) return FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, sourceScope).also { createSessionForDependencies(project, provider, moduleInfo, librariesScope, packagePartProvider) - it.extensionService.registerExtensions(BunchOfRegisteredExtensions.empty()) } } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt index a6267eb2b64..7c0432c2e23 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.PrivateSessionConstructor +import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider @@ -34,6 +35,7 @@ internal class FirIdeLibrariesSession private constructor( override val scope: GlobalSearchScope ) : FirIdeSession(moduleInfo, sessionProvider) { companion object { + @OptIn(SessionConfiguration::class) fun create( moduleInfo: ModuleSourceInfo, sessionProvider: FirIdeSessionProvider, diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSourcesSession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSourcesSession.kt index 036e92764e0..4780e67dc8a 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSourcesSession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSourcesSession.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvide import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.resolve.transformers.PhasedFirFileResolver import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider -import org.jetbrains.kotlin.fir.session.registerCheckersComponent import org.jetbrains.kotlin.fir.session.registerCommonComponents import org.jetbrains.kotlin.fir.session.registerJavaSpecificComponents import org.jetbrains.kotlin.fir.session.registerResolveComponents @@ -51,6 +50,7 @@ internal class FirIdeSourcesSession private constructor( /** * Should be invoked only under a [moduleInfo]-based lock */ + @OptIn(SessionConfiguration::class) fun create( project: Project, moduleInfo: ModuleSourceInfo, @@ -68,7 +68,6 @@ internal class FirIdeSourcesSession private constructor( registerCommonComponents() registerResolveComponents() - registerCheckersComponent() val provider = FirIdeProvider( project, diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirMultiModuleResolveTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirMultiModuleResolveTest.kt index a997af1c092..7c72843c7be 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirMultiModuleResolveTest.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirMultiModuleResolveTest.kt @@ -15,9 +15,6 @@ import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.dependenciesWithoutSelf -import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions -import org.jetbrains.kotlin.fir.extensions.extensionService -import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.* import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.resolve.firProvider @@ -60,9 +57,7 @@ abstract class AbstractFirMultiModuleResolveTest : AbstractMultiModuleTest() { private fun createSession(module: Module, provider: FirProjectSessionProvider): FirJavaModuleBasedSession { val moduleInfo = module.productionSourceInfo()!! - return FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, moduleInfo.contentScope()).also { - it.extensionService.registerExtensions(BunchOfRegisteredExtensions.empty()) - } + return FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, moduleInfo.contentScope()) } private fun createLibrarySession(moduleInfo: IdeaModuleInfo, provider: FirProjectSessionProvider): FirLibrarySession { diff --git a/plugins/fir/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/AbstractFirAllOpenDiagnosticTest.kt b/plugins/fir/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/AbstractFirAllOpenDiagnosticTest.kt index 20d0d48321a..ee7451086d3 100644 --- a/plugins/fir/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/AbstractFirAllOpenDiagnosticTest.kt +++ b/plugins/fir/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/AbstractFirAllOpenDiagnosticTest.kt @@ -8,16 +8,15 @@ package org.jetbrains.kotlin.fir.plugin import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.fir.AbstractFirDiagnosticsTest -import org.jetbrains.kotlin.fir.extensions.FirExtensionService -import org.jetbrains.kotlin.fir.extensions.registerExtensions +import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions import java.io.File abstract class AbstractFirAllOpenDiagnosticTest : AbstractFirDiagnosticsTest() { override val pluginPhasesEnabled: Boolean get() = true - override fun registerFirExtensions(service: FirExtensionService) { - service.registerExtensions(FirAllOpenComponentRegistrar().configure()) + override fun getFirExtensions(): BunchOfRegisteredExtensions { + return FirAllOpenComponentRegistrar().configure() } override fun updateConfiguration(configuration: CompilerConfiguration) {