[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
This commit is contained in:
Dmitriy Novozhilov
2020-08-28 17:35:23 +03:00
parent 2819bd3aaf
commit 6db8c28291
24 changed files with 158 additions and 149 deletions
@@ -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.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
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.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor
import org.jetbrains.kotlin.fir.session.FirSessionFactory import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.fir.session.registerExtendedCheckersComponent
import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.ir.backend.jvm.jvmResolveLibraries import org.jetbrains.kotlin.ir.backend.jvm.jvmResolveLibraries
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmManglerDesc import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmManglerDesc
@@ -353,7 +350,11 @@ object KotlinToJVMBytecodeCompiler {
} }
val moduleInfo = FirJvmModuleInfo(module.getModuleName()) 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("<dependencies>")) val dependenciesInfo = FirJvmModuleInfo(Name.special("<dependencies>"))
moduleInfo.dependencies.add(dependenciesInfo) moduleInfo.dependencies.add(dependenciesInfo)
val librariesScope = ProjectScope.getLibrariesScope(project) val librariesScope = ProjectScope.getLibrariesScope(project)
@@ -361,10 +362,6 @@ object KotlinToJVMBytecodeCompiler {
dependenciesInfo, provider, librariesScope, dependenciesInfo, provider, librariesScope,
project, environment.createPackagePartProvider(librariesScope) project, environment.createPackagePartProvider(librariesScope)
) )
it.extensionService.registerExtensions(BunchOfRegisteredExtensions.empty())
if (extendedAnalysisMode) {
it.registerExtendedCheckersComponent()
}
} }
val firProvider = (session.firProvider as FirProviderImpl) val firProvider = (session.firProvider as FirProviderImpl)
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, stubMode = false) val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, stubMode = false)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent 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.cfa.AbstractFirPropertyInitializationChecker
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.* 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 import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
class CheckersComponent : FirSessionComponent { class CheckersComponent : FirSessionComponent {
companion object {
fun componentWithDefaultCheckers(): CheckersComponent {
return CheckersComponent().apply {
register(CommonDeclarationCheckers)
register(CommonExpressionCheckers)
}
}
}
val declarationCheckers: DeclarationCheckers get() = _declarationCheckers val declarationCheckers: DeclarationCheckers get() = _declarationCheckers
private val _declarationCheckers = ComposedDeclarationCheckers() private val _declarationCheckers = ComposedDeclarationCheckers()
val expressionCheckers: ExpressionCheckers get() = _expressionCheckers val expressionCheckers: ExpressionCheckers get() = _expressionCheckers
private val _expressionCheckers = ComposedExpressionCheckers() private val _expressionCheckers = ComposedExpressionCheckers()
@SessionConfiguration
fun register(checkers: DeclarationCheckers) { fun register(checkers: DeclarationCheckers) {
_declarationCheckers.register(checkers) _declarationCheckers.register(checkers)
} }
@SessionConfiguration
fun register(checkers: ExpressionCheckers) { fun register(checkers: ExpressionCheckers) {
_expressionCheckers.register(checkers) _expressionCheckers.register(checkers)
} }
@SessionConfiguration
fun register(checkers: FirAdditionalCheckersExtension) { fun register(checkers: FirAdditionalCheckersExtension) {
register(checkers.declarationCheckers) register(checkers.declarationCheckers)
register(checkers.expressionCheckers) register(checkers.expressionCheckers)
@@ -5,20 +5,3 @@
package org.jetbrains.kotlin.fir.analysis.checkers.expression package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirSealedClassConstructorCallChecker
object CommonExpressionCheckers : ExpressionCheckers() {
override val expressionCheckers: List<FirBasicExpresionChecker> = listOf()
override val qualifiedAccessCheckers: List<FirQualifiedAccessChecker> = listOf(
FirSuperNotAvailableChecker,
FirNotASupertypeChecker,
FirSuperclassNotAccessibleFromInterfaceChecker,
FirAbstractSuperCallChecker,
FirQualifiedSupertypeExtendedByOtherSupertypeChecker,
FirProjectionsOnNonClassTypeArgumentChecker,
FirUpperBoundViolatedChecker,
FirTypeArgumentsNotAllowedExpressionChecker,
FirSealedClassConstructorCallChecker,
)
override val functionCallCheckers: List<FirFunctionCallChecker> = listOf()
}
@@ -6,13 +6,9 @@
package org.jetbrains.kotlin.fir.analysis.collectors package org.jetbrains.kotlin.fir.analysis.collectors
import org.jetbrains.kotlin.fir.FirSession 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 { object FirDiagnosticsCollector {
fun create(session: FirSession): AbstractDiagnosticCollector { fun create(session: FirSession): AbstractDiagnosticCollector {
session.registerAdditionalCheckers()
val collector = SimpleDiagnosticsCollector(session) val collector = SimpleDiagnosticsCollector(session)
collector.registerAllComponents() collector.registerAllComponents()
return collector return collector
@@ -21,13 +17,8 @@ object FirDiagnosticsCollector {
// Use in CLI compiler // Use in CLI compiler
@Suppress("unused") @Suppress("unused")
fun createParallel(session: FirSession): AbstractDiagnosticCollector { fun createParallel(session: FirSession): AbstractDiagnosticCollector {
session.registerAdditionalCheckers()
val collector = ParallelDiagnosticsCollector(session, numberOfThreads = 4) val collector = ParallelDiagnosticsCollector(session, numberOfThreads = 4)
collector.registerAllComponents() collector.registerAllComponents()
return collector return collector
} }
}
private fun FirSession.registerAdditionalCheckers() {
extensionService.additionalCheckers.forEach(checkersComponent::register)
}
}
@@ -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)
}
@@ -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. * 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.AbstractFirPropertyInitializationChecker
import org.jetbrains.kotlin.fir.analysis.cfa.FirCallsEffectAnalyzer import org.jetbrains.kotlin.fir.analysis.cfa.FirCallsEffectAnalyzer
import org.jetbrains.kotlin.fir.analysis.cfa.FirPropertyInitializationAnalyzer import org.jetbrains.kotlin.fir.analysis.cfa.FirPropertyInitializationAnalyzer
import org.jetbrains.kotlin.fir.analysis.cfa.FirReturnsImpliesAnalyzer import org.jetbrains.kotlin.fir.analysis.cfa.FirReturnsImpliesAnalyzer
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
object CommonDeclarationCheckers : DeclarationCheckers() { object CommonDeclarationCheckers : DeclarationCheckers() {
override val fileCheckers: List<FirFileChecker> = listOf( override val fileCheckers: List<FirFileChecker> = listOf()
)
override val declarationCheckers: List<FirBasicDeclarationChecker> = listOf( override val declarationCheckers: List<FirBasicDeclarationChecker> = listOf(
FirAnnotationClassDeclarationChecker, FirAnnotationClassDeclarationChecker,
@@ -27,7 +26,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
FirConflictingProjectionChecker, FirConflictingProjectionChecker,
) )
override val memberDeclarationCheckers: List<FirMemberDeclarationChecker> =listOf( override val memberDeclarationCheckers: List<FirMemberDeclarationChecker> = listOf(
FirInfixFunctionDeclarationChecker, FirInfixFunctionDeclarationChecker,
FirExposedVisibilityDeclarationChecker, FirExposedVisibilityDeclarationChecker,
FirCommonConstructorDelegationIssuesChecker, FirCommonConstructorDelegationIssuesChecker,
@@ -59,4 +58,4 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
override val variableAssignmentCfaBasedCheckers: List<AbstractFirPropertyInitializationChecker> = listOf( override val variableAssignmentCfaBasedCheckers: List<AbstractFirPropertyInitializationChecker> = listOf(
FirPropertyInitializationAnalyzer FirPropertyInitializationAnalyzer
) )
} }
@@ -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<FirBasicExpresionChecker> = listOf()
override val qualifiedAccessCheckers: List<FirQualifiedAccessChecker> = listOf(
FirSuperNotAvailableChecker,
FirNotASupertypeChecker,
FirSuperclassNotAccessibleFromInterfaceChecker,
FirAbstractSuperCallChecker,
FirQualifiedSupertypeExtendedByOtherSupertypeChecker,
FirProjectionsOnNonClassTypeArgumentChecker,
FirUpperBoundViolatedChecker,
FirTypeArgumentsNotAllowedExpressionChecker,
FirSealedClassConstructorCallChecker,
)
override val functionCallCheckers: List<FirFunctionCallChecker> = listOf()
}
@@ -5,30 +5,25 @@
package org.jetbrains.kotlin.fir.session package org.jetbrains.kotlin.fir.session
import org.jetbrains.kotlin.fir.FirModuleBasedSession import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.CheckersComponent 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.FirExtensionService
import org.jetbrains.kotlin.fir.extensions.FirPredicateBasedProvider import org.jetbrains.kotlin.fir.extensions.FirPredicateBasedProvider
import org.jetbrains.kotlin.fir.extensions.FirRegisteredPluginAnnotations import org.jetbrains.kotlin.fir.extensions.FirRegisteredPluginAnnotations
import org.jetbrains.kotlin.fir.java.registerJavaVisibilityChecker import org.jetbrains.kotlin.fir.java.FirJavaVisibilityChecker
import org.jetbrains.kotlin.fir.registerJvmEffectiveVisibilityResolver import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider
import org.jetbrains.kotlin.fir.resolve.calls.jvm.registerJvmCallConflictResolverFactory 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.FirQualifierResolverImpl
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirTypeResolverImpl 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.resolve.transformers.plugin.GeneratedClassIndex
import org.jetbrains.kotlin.fir.scopes.impl.FirDeclaredMemberScopeProvider import org.jetbrains.kotlin.fir.scopes.impl.FirDeclaredMemberScopeProvider
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
// -------------------------- Required components -------------------------- // -------------------------- Required components --------------------------
@OptIn(SessionConfiguration::class)
fun FirSession.registerCommonComponents() { fun FirSession.registerCommonComponents() {
register(FirDeclaredMemberScopeProvider::class, FirDeclaredMemberScopeProvider()) register(FirDeclaredMemberScopeProvider::class, FirDeclaredMemberScopeProvider())
register(FirCorrespondingSupertypesCache::class, FirCorrespondingSupertypesCache(this)) register(FirCorrespondingSupertypesCache::class, FirCorrespondingSupertypesCache(this))
@@ -41,31 +36,24 @@ fun FirSession.registerCommonComponents() {
// -------------------------- Resolve components -------------------------- // -------------------------- Resolve components --------------------------
// TODO: rename to `registerCommonResolveComponents /*
* Resolve components which are same on all platforms
*/
@OptIn(SessionConfiguration::class)
fun FirModuleBasedSession.registerResolveComponents() { fun FirModuleBasedSession.registerResolveComponents() {
register(FirQualifierResolver::class, FirQualifierResolverImpl(this)) register(FirQualifierResolver::class, FirQualifierResolverImpl(this))
register(FirTypeResolver::class, FirTypeResolverImpl(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 * Resolve components which have specific implementations on JVM
* exact checkers according to platforms of current session
*/ */
fun FirModuleBasedSession.registerCheckersComponent() { @OptIn(SessionConfiguration::class)
register(CheckersComponent::class, CheckersComponent.componentWithDefaultCheckers()) fun FirModuleBasedSession.registerJavaSpecificComponents() {
} register(FirVisibilityChecker::class, FirJavaVisibilityChecker)
register(ConeCallConflictResolverFactory::class, JvmCallConflictResolverFactory)
fun FirModuleBasedSession.registerExtendedCheckersComponent() { register(FirEffectiveVisibilityResolver::class, FirJvmEffectiveVisibilityResolver(this))
this.checkersComponent.register(ExtendedExpressionCheckers) register(FirPlatformClassMapper::class, FirJavaClassMapper(this))
this.checkersComponent.register(ExtendedDeclarationCheckers) register(FirSyntheticNamesProvider::class, FirJavaSyntheticNamesProvider)
} }
@@ -10,8 +10,18 @@ import com.intellij.psi.PsiElementFinder
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.FirModuleBasedSession
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.PrivateSessionConstructor 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.*
import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider 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.PackagePartProvider
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
@OptIn(PrivateSessionConstructor::class) @OptIn(PrivateSessionConstructor::class, SessionConfiguration::class)
object FirSessionFactory { object FirSessionFactory {
class FirSessionConfigurator(private val session: FirModuleBasedSession) {
private val registeredExtensions = mutableListOf<BunchOfRegisteredExtensions>(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( fun createJavaModuleBasedSession(
moduleInfo: ModuleInfo, moduleInfo: ModuleInfo,
sessionProvider: FirProjectSessionProvider, sessionProvider: FirProjectSessionProvider,
scope: GlobalSearchScope, scope: GlobalSearchScope,
dependenciesProvider: FirSymbolProvider? = null dependenciesProvider: FirSymbolProvider? = null,
init: FirSessionConfigurator.() -> Unit = {}
): FirJavaModuleBasedSession { ): FirJavaModuleBasedSession {
return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply { return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply {
registerCommonComponents() registerCommonComponents()
registerResolveComponents() registerResolveComponents()
registerCheckersComponent()
registerJavaSpecificComponents() registerJavaSpecificComponents()
val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped)
@@ -54,6 +86,11 @@ object FirSessionFactory {
) as FirSymbolProvider ) as FirSymbolProvider
) )
FirSessionConfigurator(this).apply {
registerCommonCheckers()
init()
}.configure()
PsiElementFinder.EP.getPoint(sessionProvider.project) PsiElementFinder.EP.getPoint(sessionProvider.project)
.registerExtension(FirJavaElementFinder(this, sessionProvider.project), sessionProvider.project) .registerExtension(FirJavaElementFinder(this, sessionProvider.project), sessionProvider.project)
} }
@@ -42,7 +42,3 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() {
} }
} }
} }
fun FirSession.registerJavaVisibilityChecker() {
register(FirVisibilityChecker::class, FirJavaVisibilityChecker)
}
@@ -15,7 +15,3 @@ class FirJvmEffectiveVisibilityResolver(session: FirSession) : FirEffectiveVisib
} }
} }
} }
fun FirSession.registerJvmEffectiveVisibilityResolver() {
register(FirEffectiveVisibilityResolver::class, FirJvmEffectiveVisibilityResolver(this))
}
@@ -16,7 +16,3 @@ class FirJavaClassMapper(private val session: FirSession) : FirPlatformClassMapp
return javaClassId?.let { session.firSymbolProvider.getClassLikeSymbolByFqName(it)?.fir } as? FirRegularClass return javaClassId?.let { session.firSymbolProvider.getClassLikeSymbolByFqName(it)?.fir } as? FirRegularClass
} }
} }
fun FirSession.registerJavaClassMapper() {
register(FirPlatformClassMapper::class, FirJavaClassMapper(this))
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider
import org.jetbrains.kotlin.load.java.propertyNameByGetMethodName import org.jetbrains.kotlin.load.java.propertyNameByGetMethodName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -41,6 +40,3 @@ object FirJavaSyntheticNamesProvider : FirSyntheticNamesProvider() {
} }
} }
fun FirSession.registerJavaSyntheticNamesProvider() {
register(FirSyntheticNamesProvider::class, FirJavaSyntheticNamesProvider)
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.resolve.calls.jvm 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.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.calls.ConeCompositeConflictResolver import org.jetbrains.kotlin.fir.resolve.calls.ConeCompositeConflictResolver
import org.jetbrains.kotlin.fir.resolve.calls.ConeOverloadConflictResolver import org.jetbrains.kotlin.fir.resolve.calls.ConeOverloadConflictResolver
@@ -25,7 +24,3 @@ object JvmCallConflictResolverFactory : ConeCallConflictResolverFactory() {
) )
} }
} }
fun FirSession.registerJvmCallConflictResolverFactory() {
register(ConeCallConflictResolverFactory::class, JvmCallConflictResolverFactory)
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.extensions package org.jetbrains.kotlin.fir.extensions
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.SessionConfiguration
import kotlin.reflect.KClass import kotlin.reflect.KClass
abstract class FirExtensionRegistrar { abstract class FirExtensionRegistrar {
@@ -76,8 +77,14 @@ class BunchOfRegisteredExtensions @PluginServicesInitialization constructor(
return BunchOfRegisteredExtensions(extensions) return BunchOfRegisteredExtensions(extensions)
} }
} }
@OptIn(PluginServicesInitialization::class)
operator fun plus(other: BunchOfRegisteredExtensions): BunchOfRegisteredExtensions {
return BunchOfRegisteredExtensions(extensions + other.extensions)
}
} }
@SessionConfiguration
@OptIn(PluginServicesInitialization::class) @OptIn(PluginServicesInitialization::class)
fun FirExtensionService.registerExtensions(registeredExtensions: BunchOfRegisteredExtensions) { fun FirExtensionService.registerExtensions(registeredExtensions: BunchOfRegisteredExtensions) {
registeredExtensions.extensions.forEach { registerExtensions(it.kClass, it.extensionFactories) } registeredExtensions.extensions.forEach { registerExtensions(it.kClass, it.extensionFactories) }
@@ -18,6 +18,9 @@ import kotlin.reflect.KClass
@RequiresOptIn @RequiresOptIn
annotation class PrivateSessionConstructor annotation class PrivateSessionConstructor
@RequiresOptIn
annotation class SessionConfiguration
interface FirSessionComponent interface FirSessionComponent
abstract class FirSession @PrivateSessionConstructor constructor(val sessionProvider: FirSessionProvider?) : ComponentArrayOwner<FirSessionComponent, FirSessionComponent>() { abstract class FirSession @PrivateSessionConstructor constructor(val sessionProvider: FirSessionProvider?) : ComponentArrayOwner<FirSessionComponent, FirSessionComponent>() {
@@ -39,6 +42,7 @@ abstract class FirSession @PrivateSessionConstructor constructor(val sessionProv
final override val typeRegistry: TypeRegistry<FirSessionComponent, FirSessionComponent> = Companion final override val typeRegistry: TypeRegistry<FirSessionComponent, FirSessionComponent> = Companion
@SessionConfiguration
fun register(tClass: KClass<out FirSessionComponent>, value: FirSessionComponent) { fun register(tClass: KClass<out FirSessionComponent>, value: FirSessionComponent) {
registerComponent(tClass, value) registerComponent(tClass, value)
} }
@@ -5,13 +5,11 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.ExtendedDeclarationCheckers import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExtendedExpressionCheckers import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.fir.analysis.checkersComponent
abstract class AbstractExtendedFirDiagnosticsTest : AbstractFirDiagnosticsTest() { abstract class AbstractExtendedFirDiagnosticsTest : AbstractFirDiagnosticsTest() {
override fun configureSession(session: FirSession) { override fun FirSessionFactory.FirSessionConfigurator.configureSession() {
session.checkersComponent.register(ExtendedDeclarationCheckers) registerExtendedCommonCheckers()
session.checkersComponent.register(ExtendedExpressionCheckers)
} }
} }
@@ -5,13 +5,11 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.ExtendedDeclarationCheckers import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExtendedExpressionCheckers import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.fir.analysis.checkersComponent
abstract class AbstractExtendedFirWithLightTreeDiagnosticsTest : AbstractFirDiagnosticsWithLightTreeTest() { abstract class AbstractExtendedFirWithLightTreeDiagnosticsTest : AbstractFirDiagnosticsWithLightTreeTest() {
override fun configureSession(session: FirSession) { override fun FirSessionFactory.FirSessionConfigurator.configureSession() {
session.checkersComponent.register(ExtendedDeclarationCheckers) registerExtendedCommonCheckers()
session.checkersComponent.register(ExtendedExpressionCheckers)
} }
} }
@@ -27,9 +27,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions 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.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
@@ -79,18 +76,18 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
FirSessionFactory.createLibrarySession( FirSessionFactory.createLibrarySession(
builtInsModuleInfo, sessionProvider, allProjectScope, project, builtInsModuleInfo, sessionProvider, allProjectScope, project,
environment.createPackagePartProvider(allProjectScope) environment.createPackagePartProvider(allProjectScope)
).also { )
registerFirExtensions(it.extensionService)
}
val configToSession = modules.mapValues { (config, info) -> val configToSession = modules.mapValues { (config, info) ->
val moduleFiles = groupedByModule.getValue(config) val moduleFiles = groupedByModule.getValue(config)
val scope = TopDownAnalyzerFacadeForJVM.newModuleSearchScope( val scope = TopDownAnalyzerFacadeForJVM.newModuleSearchScope(
project, project,
moduleFiles.mapNotNull { it.ktFile }) moduleFiles.mapNotNull { it.ktFile })
FirSessionFactory.createJavaModuleBasedSession(info, sessionProvider, scope).also { FirSessionFactory.createJavaModuleBasedSession(info, sessionProvider, scope) {
registerFirExtensions(it.extensionService) configureSession()
configureSession(it) getFirExtensions()?.let {
registerExtensions(it)
}
} }
} }
@@ -110,8 +107,8 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
runAnalysis(testDataFile, files, firFilesPerSession) runAnalysis(testDataFile, files, firFilesPerSession)
} }
open fun registerFirExtensions(service: FirExtensionService) { protected open fun getFirExtensions(): BunchOfRegisteredExtensions? {
service.registerExtensions(BunchOfRegisteredExtensions.empty()) return null
} }
private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List<KtFile>, firFiles: MutableList<FirFile>, useLightTree: Boolean) { private fun mapKtFilesToFirFiles(session: FirSession, ktFiles: List<KtFile>, firFiles: MutableList<FirFile>, useLightTree: Boolean) {
@@ -333,5 +330,5 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
return result return result
} }
protected open fun configureSession(session: FirSession) {} protected open fun FirSessionFactory.FirSessionConfigurator.configureSession() {}
} }
@@ -8,9 +8,6 @@ package org.jetbrains.kotlin.fir
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment 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.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.session.FirSessionFactory import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
@@ -34,7 +31,6 @@ fun createSession(
val provider = FirProjectSessionProvider(project) val provider = FirProjectSessionProvider(project)
return FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, sourceScope).also { return FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, sourceScope).also {
createSessionForDependencies(project, provider, moduleInfo, librariesScope, packagePartProvider) createSessionForDependencies(project, provider, moduleInfo, librariesScope, packagePartProvider)
it.extensionService.registerExtensions(BunchOfRegisteredExtensions.empty())
} }
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.PrivateSessionConstructor import org.jetbrains.kotlin.fir.PrivateSessionConstructor
import org.jetbrains.kotlin.fir.SessionConfiguration
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider
@@ -34,6 +35,7 @@ internal class FirIdeLibrariesSession private constructor(
override val scope: GlobalSearchScope override val scope: GlobalSearchScope
) : FirIdeSession(moduleInfo, sessionProvider) { ) : FirIdeSession(moduleInfo, sessionProvider) {
companion object { companion object {
@OptIn(SessionConfiguration::class)
fun create( fun create(
moduleInfo: ModuleSourceInfo, moduleInfo: ModuleSourceInfo,
sessionProvider: FirIdeSessionProvider, sessionProvider: FirIdeSessionProvider,
@@ -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.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.resolve.transformers.PhasedFirFileResolver import org.jetbrains.kotlin.fir.resolve.transformers.PhasedFirFileResolver
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider 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.registerCommonComponents
import org.jetbrains.kotlin.fir.session.registerJavaSpecificComponents import org.jetbrains.kotlin.fir.session.registerJavaSpecificComponents
import org.jetbrains.kotlin.fir.session.registerResolveComponents 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 * Should be invoked only under a [moduleInfo]-based lock
*/ */
@OptIn(SessionConfiguration::class)
fun create( fun create(
project: Project, project: Project,
moduleInfo: ModuleSourceInfo, moduleInfo: ModuleSourceInfo,
@@ -68,7 +68,6 @@ internal class FirIdeSourcesSession private constructor(
registerCommonComponents() registerCommonComponents()
registerResolveComponents() registerResolveComponents()
registerCheckersComponent()
val provider = FirIdeProvider( val provider = FirIdeProvider(
project, project,
@@ -15,9 +15,6 @@ import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.dependenciesWithoutSelf 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.java.*
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
@@ -60,9 +57,7 @@ abstract class AbstractFirMultiModuleResolveTest : AbstractMultiModuleTest() {
private fun createSession(module: Module, provider: FirProjectSessionProvider): FirJavaModuleBasedSession { private fun createSession(module: Module, provider: FirProjectSessionProvider): FirJavaModuleBasedSession {
val moduleInfo = module.productionSourceInfo()!! val moduleInfo = module.productionSourceInfo()!!
return FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, moduleInfo.contentScope()).also { return FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, moduleInfo.contentScope())
it.extensionService.registerExtensions(BunchOfRegisteredExtensions.empty())
}
} }
private fun createLibrarySession(moduleInfo: IdeaModuleInfo, provider: FirProjectSessionProvider): FirLibrarySession { private fun createLibrarySession(moduleInfo: IdeaModuleInfo, provider: FirProjectSessionProvider): FirLibrarySession {
@@ -8,16 +8,15 @@ package org.jetbrains.kotlin.fir.plugin
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.fir.AbstractFirDiagnosticsTest import org.jetbrains.kotlin.fir.AbstractFirDiagnosticsTest
import org.jetbrains.kotlin.fir.extensions.FirExtensionService import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
import org.jetbrains.kotlin.fir.extensions.registerExtensions
import java.io.File import java.io.File
abstract class AbstractFirAllOpenDiagnosticTest : AbstractFirDiagnosticsTest() { abstract class AbstractFirAllOpenDiagnosticTest : AbstractFirDiagnosticsTest() {
override val pluginPhasesEnabled: Boolean override val pluginPhasesEnabled: Boolean
get() = true get() = true
override fun registerFirExtensions(service: FirExtensionService) { override fun getFirExtensions(): BunchOfRegisteredExtensions {
service.registerExtensions(FirAllOpenComponentRegistrar().configure()) return FirAllOpenComponentRegistrar().configure()
} }
override fun updateConfiguration(configuration: CompilerConfiguration) { override fun updateConfiguration(configuration: CompilerConfiguration) {