[FIR] Create session component with registered checkers

This commit is contained in:
Dmitriy Novozhilov
2020-05-08 12:32:50 +03:00
parent b61b4e4a97
commit 6d6ed1e755
18 changed files with 201 additions and 69 deletions
@@ -0,0 +1,80 @@
/*
* 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.analysis
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.analysis.checkers.call.*
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.expressions.FirExpression
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()
fun register(checkers: DeclarationCheckers) {
_declarationCheckers.register(checkers)
}
fun register(checkers: ExpressionCheckers) {
_expressionCheckers.register(checkers)
}
}
val FirSession.checkersComponent: CheckersComponent by FirSession.sessionComponentAccessor()
private class ComposedDeclarationCheckers : DeclarationCheckers() {
override val declarationCheckers: List<FirBasicDeclarationChecker>
get() = _declarationCheckers
override val memberDeclarationCheckers: List<FirMemberDeclarationChecker>
get() = _memberDeclarationCheckers
override val constructorCheckers: List<FirConstructorChecker>
get() = _constructorCheckers
private val _declarationCheckers: MutableList<FirBasicDeclarationChecker> = mutableListOf()
private val _memberDeclarationCheckers: MutableList<FirMemberDeclarationChecker> = mutableListOf()
private val _constructorCheckers: MutableList<FirConstructorChecker> = mutableListOf()
fun register(checkers: DeclarationCheckers) {
_declarationCheckers += checkers.declarationCheckers
_memberDeclarationCheckers += checkers.allMemberDeclarationCheckers
_constructorCheckers += checkers.allConstructorCheckers
}
}
private class ComposedExpressionCheckers : ExpressionCheckers() {
override val expressionCheckers: List<FirBasicExpresionChecker>
get() = _expressionCheckers
override val qualifiedAccessCheckers: List<FirQualifiedAccessChecker>
get() = _qualifiedAccessCheckers
override val functionCallCheckers: List<FirFunctionCallChecker>
get() = _functionCallCheckers
private val _expressionCheckers: MutableList<FirBasicExpresionChecker> = mutableListOf()
private val _qualifiedAccessCheckers: MutableList<FirQualifiedAccessChecker> = mutableListOf()
private val _functionCallCheckers: MutableList<FirFunctionCallChecker> = mutableListOf()
fun register(checkers: ExpressionCheckers) {
_expressionCheckers += checkers.allExpressionCheckers
_qualifiedAccessCheckers += checkers.allQualifiedAccessCheckers
_functionCallCheckers += checkers.allFunctionCallCheckers
}
}
@@ -5,20 +5,12 @@
package org.jetbrains.kotlin.fir.analysis.checkers.call
import org.jetbrains.kotlin.fir.expressions.FirExpression
abstract class ExpressionCheckers {
open val expressionCheckers: List<FirBasicExpresionChecker> = emptyList()
open val qualifiedAccessCheckers: List<FirQualifiedAccessChecker> = emptyList()
open val functionCallCheckers: List<FirFunctionCallChecker> = emptyList()
object CallCheckers {
val EXPRESSIONS: List<FirExpressionChecker<FirExpression>> = listOf()
val QUALIFIED_ACCESS: List<FirQualifiedAccessChecker> = listOf(
FirSuperNotAvailableChecker,
FirNotASupertypeChecker,
FirSuperclassNotAccessibleFromInterfaceChecker,
FirAbstractSuperCallChecker,
FirQualifiedSupertypeExtendedByOtherSupertypeChecker,
) + EXPRESSIONS
val FUNCTION_CALLS: List<FirFunctionCallChecker> = listOf<FirFunctionCallChecker>(
) + QUALIFIED_ACCESS
internal val allExpressionCheckers get() = expressionCheckers
internal val allQualifiedAccessCheckers get() = qualifiedAccessCheckers + allExpressionCheckers
internal val allFunctionCallCheckers get() = functionCallCheckers + allQualifiedAccessCheckers
}
@@ -0,0 +1,18 @@
/*
* 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.analysis.checkers.call
object CommonExpressionCheckers : ExpressionCheckers() {
override val expressionCheckers: List<FirBasicExpresionChecker> = listOf()
override val qualifiedAccessCheckers: List<FirQualifiedAccessChecker> = listOf(
FirSuperNotAvailableChecker,
FirNotASupertypeChecker,
FirSuperclassNotAccessibleFromInterfaceChecker,
FirAbstractSuperCallChecker,
FirQualifiedSupertypeExtendedByOtherSupertypeChecker,
)
override val functionCallCheckers: List<FirFunctionCallChecker> = listOf()
}
@@ -15,5 +15,6 @@ abstract class FirExpressionChecker<in E : FirExpression> {
abstract fun check(functionCall: E, context: CheckerContext, reporter: DiagnosticReporter)
}
typealias FirBasicExpresionChecker = FirExpressionChecker<FirExpression>
typealias FirQualifiedAccessChecker = FirExpressionChecker<FirQualifiedAccessExpression>
typealias FirFunctionCallChecker = FirExpressionChecker<FirFunctionCall>
typealias FirQualifiedAccessChecker = FirExpressionChecker<FirQualifiedAccessExpression>
@@ -5,20 +5,11 @@
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
abstract class DeclarationCheckers {
open val declarationCheckers: List<FirBasicDeclarationChecker> = emptyList()
open val memberDeclarationCheckers: List<FirMemberDeclarationChecker> = emptyList()
open val constructorCheckers: List<FirConstructorChecker> = emptyList()
object DeclarationCheckers {
val DECLARATIONS: List<FirDeclarationChecker<FirDeclaration>> = listOf(
FirModifierChecker
)
val MEMBER_DECLARATIONS: List<FirDeclarationChecker<FirMemberDeclaration>> = DECLARATIONS + listOf(
FirAnnotationClassDeclarationChecker,
FirInfixFunctionDeclarationChecker,
FirExposedVisibilityChecker
)
val CONSTRUCTORS: List<FirDeclarationChecker<FirConstructor>> = MEMBER_DECLARATIONS + listOf(
FirConstructorChecker
)
}
internal val allMemberDeclarationCheckers: List<FirMemberDeclarationChecker> get() = memberDeclarationCheckers + declarationCheckers
internal val allConstructorCheckers: List<FirConstructorChecker> get() = constructorCheckers + allMemberDeclarationCheckers
}
@@ -0,0 +1,22 @@
/*
* 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.analysis.checkers.declaration
object CommonDeclarationCheckers : DeclarationCheckers() {
override val declarationCheckers: List<FirBasicDeclarationChecker> = listOf(
FirAnnotationClassDeclarationChecker,
FirModifierChecker
)
override val memberDeclarationCheckers: List<FirMemberDeclarationChecker> = listOf(
FirInfixFunctionDeclarationChecker,
FirExposedVisibilityChecker
)
override val constructorCheckers: List<FirConstructorChecker> = listOf(
FirConstructorAllowedChecker
)
}
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.lexer.KtTokens.VAR_KEYWORD
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtParameter
object FirAnnotationClassDeclarationChecker : FirDeclarationChecker<FirDeclaration>() {
object FirAnnotationClassDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirRegularClass) return
if (declaration.classKind != ANNOTATION_CLASS) return
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticFactory0
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.*
object FirConstructorChecker : FirDeclarationChecker<FirConstructor>() {
object FirConstructorAllowedChecker : FirConstructorChecker() {
override fun check(declaration: FirConstructor, context: CheckerContext, reporter: DiagnosticReporter) {
val containingClass = context.containingDeclarations.lastOrNull() as? FirClass<*> ?: return
val source = declaration.source
@@ -7,8 +7,14 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
abstract class FirDeclarationChecker<in D : FirDeclaration> {
abstract fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter)
}
}
typealias FirBasicDeclarationChecker = FirDeclarationChecker<FirDeclaration>
typealias FirMemberDeclarationChecker = FirDeclarationChecker<FirMemberDeclaration>
typealias FirConstructorChecker = FirDeclarationChecker<FirConstructor>
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneTypeSafe
import org.jetbrains.kotlin.lexer.KtTokens
object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>() {
object FirExposedVisibilityChecker : FirMemberDeclarationChecker() {
override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
when (declaration) {
is FirTypeAlias -> checkTypeAlias(declaration, reporter)
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.isInfix
object FirInfixFunctionDeclarationChecker : FirDeclarationChecker<FirMemberDeclaration>() {
object FirInfixFunctionDeclarationChecker : FirMemberDeclarationChecker() {
override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration is FirSimpleFunction && declaration.isInfix) {
if (declaration.valueParameters.size != 1 || !hasExtensionOrDispatchReceiver(declaration, context)) {
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens.*
object FirModifierChecker : FirDeclarationChecker<FirDeclaration>() {
object FirModifierChecker : FirBasicDeclarationChecker() {
private enum class CompatibilityType {
COMPATIBLE,
@@ -6,12 +6,15 @@
package org.jetbrains.kotlin.fir.analysis.collectors.components
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.visitors.FirVisitor
abstract class AbstractDiagnosticCollectorComponent(private val collector: AbstractDiagnosticCollector) : FirVisitor<Unit, CheckerContext>() {
protected val session: FirSession = collector.session
override fun visitElement(element: FirElement, data: CheckerContext) {}
protected fun runCheck(block: (DiagnosticReporter) -> Unit) {
@@ -6,63 +6,65 @@
package org.jetbrains.kotlin.fir.analysis.collectors.components
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.checkersComponent
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.declarations.*
class DeclarationCheckersDiagnosticComponent(collector: AbstractDiagnosticCollector) : AbstractDiagnosticCollectorComponent(collector) {
private val checkers = session.checkersComponent.declarationCheckers
override fun visitProperty(property: FirProperty, data: CheckerContext) {
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(property, data, it) }
runCheck { checkers.memberDeclarationCheckers.check(property, data, it) }
}
override fun visitRegularClass(regularClass: FirRegularClass, data: CheckerContext) {
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(regularClass, data, it) }
runCheck { checkers.memberDeclarationCheckers.check(regularClass, data, it) }
}
override fun visitSealedClass(sealedClass: FirSealedClass, data: CheckerContext) {
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(sealedClass, data, it) }
runCheck { checkers.memberDeclarationCheckers.check(sealedClass, data, it) }
}
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: CheckerContext) {
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(simpleFunction, data, it) }
runCheck { checkers.memberDeclarationCheckers.check(simpleFunction, data, it) }
}
override fun visitTypeAlias(typeAlias: FirTypeAlias, data: CheckerContext) {
runCheck { DeclarationCheckers.MEMBER_DECLARATIONS.check(typeAlias, data, it) }
runCheck { checkers.memberDeclarationCheckers.check(typeAlias, data, it) }
}
override fun visitConstructor(constructor: FirConstructor, data: CheckerContext) {
runCheck { DeclarationCheckers.CONSTRUCTORS.check(constructor, data, it) }
runCheck { checkers.constructorCheckers.check(constructor, data, it) }
}
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: CheckerContext) {
runCheck { DeclarationCheckers.DECLARATIONS.check(anonymousFunction, data, it) }
runCheck { checkers.declarationCheckers.check(anonymousFunction, data, it) }
}
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: CheckerContext) {
runCheck { DeclarationCheckers.DECLARATIONS.check(propertyAccessor, data, it) }
runCheck { checkers.declarationCheckers.check(propertyAccessor, data, it) }
}
override fun visitValueParameter(valueParameter: FirValueParameter, data: CheckerContext) {
runCheck { DeclarationCheckers.DECLARATIONS.check(valueParameter, data, it) }
runCheck { checkers.declarationCheckers.check(valueParameter, data, it) }
}
override fun visitTypeParameter(typeParameter: FirTypeParameter, data: CheckerContext) {
runCheck { DeclarationCheckers.DECLARATIONS.check(typeParameter, data, it) }
runCheck { checkers.declarationCheckers.check(typeParameter, data, it) }
}
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: CheckerContext) {
runCheck { DeclarationCheckers.DECLARATIONS.check(enumEntry, data, it) }
runCheck { checkers.declarationCheckers.check(enumEntry, data, it) }
}
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: CheckerContext) {
runCheck { DeclarationCheckers.DECLARATIONS.check(anonymousObject, data, it) }
runCheck { checkers.declarationCheckers.check(anonymousObject, data, it) }
}
override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: CheckerContext) {
runCheck { DeclarationCheckers.DECLARATIONS.check(anonymousInitializer, data, it) }
runCheck { checkers.declarationCheckers.check(anonymousInitializer, data, it) }
}
private fun <D : FirDeclaration> List<FirDeclarationChecker<D>>.check(
@@ -5,76 +5,78 @@
package org.jetbrains.kotlin.fir.analysis.collectors.components
import org.jetbrains.kotlin.fir.analysis.checkers.call.CallCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.call.FirExpressionChecker
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkersComponent
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.expressions.*
class ExpressionCheckersDiagnosticComponent(collector: AbstractDiagnosticCollector) : AbstractDiagnosticCollectorComponent(collector) {
private val checkers = session.checkersComponent.expressionCheckers
override fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(typeOperatorCall, data, it) }
runCheck { checkers.expressionCheckers.check(typeOperatorCall, data, it) }
}
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(constExpression, data, it) }
runCheck { checkers.expressionCheckers.check(constExpression, data, it) }
}
override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(annotationCall, data, it) }
runCheck { checkers.expressionCheckers.check(annotationCall, data, it) }
}
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: CheckerContext) {
runCheck { CallCheckers.QUALIFIED_ACCESS.check(qualifiedAccessExpression, data, it) }
runCheck { checkers.qualifiedAccessCheckers.check(qualifiedAccessExpression, data, it) }
}
override fun visitFunctionCall(functionCall: FirFunctionCall, data: CheckerContext) {
runCheck { CallCheckers.FUNCTION_CALLS.check(functionCall, data, it) }
runCheck { checkers.functionCallCheckers.check(functionCall, data, it) }
}
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: CheckerContext) {
runCheck { CallCheckers.QUALIFIED_ACCESS.check(callableReferenceAccess, data, it) }
runCheck { checkers.qualifiedAccessCheckers.check(callableReferenceAccess, data, it) }
}
override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(thisReceiverExpression, data, it) }
runCheck { checkers.expressionCheckers.check(thisReceiverExpression, data, it) }
}
override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(resolvedQualifier, data, it) }
runCheck { checkers.expressionCheckers.check(resolvedQualifier, data, it) }
}
override fun visitWhenExpression(whenExpression: FirWhenExpression, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(whenExpression, data, it) }
runCheck { checkers.expressionCheckers.check(whenExpression, data, it) }
}
override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(binaryLogicExpression, data, it) }
runCheck { checkers.expressionCheckers.check(binaryLogicExpression, data, it) }
}
override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(arrayOfCall, data, it) }
runCheck { checkers.expressionCheckers.check(arrayOfCall, data, it) }
}
override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(stringConcatenationCall, data, it) }
runCheck { checkers.expressionCheckers.check(stringConcatenationCall, data, it) }
}
override fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(checkNotNullCall, data, it) }
runCheck { checkers.expressionCheckers.check(checkNotNullCall, data, it) }
}
override fun visitTryExpression(tryExpression: FirTryExpression, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(tryExpression, data, it) }
runCheck { checkers.expressionCheckers.check(tryExpression, data, it) }
}
override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(classReferenceExpression, data, it) }
runCheck { checkers.expressionCheckers.check(classReferenceExpression, data, it) }
}
override fun visitGetClassCall(getClassCall: FirGetClassCall, data: CheckerContext) {
runCheck { CallCheckers.EXPRESSIONS.check(getClassCall, data, it) }
runCheck { checkers.expressionCheckers.check(getClassCall, data, it) }
}
private fun <E : FirExpression> List<FirExpressionChecker<E>>.check(expression: E, context: CheckerContext, reporter: DiagnosticReporter) {
+1
View File
@@ -8,6 +8,7 @@ dependencies {
compile(project(":compiler:frontend.common"))
compile(project(":compiler:frontend.java"))
compile(project(":compiler:fir:resolve"))
compile(project(":compiler:fir:checkers"))
implementation(project(":compiler:fir:jvm"))
compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.FirModuleBasedSession
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionBase
import org.jetbrains.kotlin.fir.FirSessionProvider
import org.jetbrains.kotlin.fir.analysis.CheckersComponent
import org.jetbrains.kotlin.fir.extensions.FirExtensionsService
import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider
import org.jetbrains.kotlin.fir.resolve.FirProvider
@@ -68,6 +69,11 @@ class FirJavaModuleBasedSession(
JvmCallConflictResolverFactory
)
registerComponent(
CheckersComponent::class,
CheckersComponent.componentWithDefaultCheckers()
)
Extensions.getArea(sessionProvider.project)
.getExtensionPoint(PsiElementFinder.EP_NAME)
.registerExtension(FirJavaElementFinder(this, sessionProvider.project))
@@ -9,6 +9,9 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.FirModuleBasedSession
import org.jetbrains.kotlin.fir.analysis.CheckersComponent
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.CommonDeclarationCheckers
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.resolve.FirProvider
@@ -55,5 +58,10 @@ class FirIdeJavaModuleBasedSession(
ConeCallConflictResolverFactory::class,
JvmCallConflictResolverFactory
)
registerComponent(
CheckersComponent::class,
CheckersComponent.componentWithDefaultCheckers()
)
}
}