From 6d6ed1e7558bae49249d70fbea44009474a63f98 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 8 May 2020 12:32:50 +0300 Subject: [PATCH] [FIR] Create session component with registered checkers --- .../kotlin/fir/analysis/CheckersComponent.kt | 80 +++++++++++++++++++ .../analysis/checkers/call/CallCheckers.kt | 22 ++--- .../call/DefaultExpressionCheckers.kt | 18 +++++ .../checkers/call/FirExpressionChecker.kt | 3 +- .../declaration/DeclarationCheckers.kt | 23 ++---- .../declaration/DefaultDeclarationCheckers.kt | 22 +++++ .../FirAnnotationClassDeclarationChecker.kt | 2 +- ...ker.kt => FirConstructorAllowedChecker.kt} | 2 +- .../declaration/FirDeclarationChecker.kt | 8 +- .../FirExposedVisibilityChecker.kt | 2 +- .../FirInfixFunctionDeclarationChecker.kt | 2 +- .../declaration/FirModifierChecker.kt | 2 +- .../AbstractDiagnosticCollectorComponent.kt | 3 + .../DeclarationCheckersDiagnosticComponent.kt | 30 +++---- .../ExpressionCheckersDiagnosticComponent.kt | 36 +++++---- compiler/fir/java/build.gradle.kts | 1 + .../fir/java/FirJavaModuleBasedSession.kt | 6 ++ .../idea/fir/FirIdeJavaModuleBasedSession.kt | 8 ++ 18 files changed, 201 insertions(+), 69 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/DefaultExpressionCheckers.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DefaultDeclarationCheckers.kt rename compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/{FirConstructorChecker.kt => FirConstructorAllowedChecker.kt} (97%) 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 new file mode 100644 index 00000000000..8db4954cd4c --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/CheckersComponent.kt @@ -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 + get() = _declarationCheckers + + override val memberDeclarationCheckers: List + get() = _memberDeclarationCheckers + + override val constructorCheckers: List + get() = _constructorCheckers + + private val _declarationCheckers: MutableList = mutableListOf() + private val _memberDeclarationCheckers: MutableList = mutableListOf() + private val _constructorCheckers: MutableList = mutableListOf() + + fun register(checkers: DeclarationCheckers) { + _declarationCheckers += checkers.declarationCheckers + _memberDeclarationCheckers += checkers.allMemberDeclarationCheckers + _constructorCheckers += checkers.allConstructorCheckers + } +} + +private class ComposedExpressionCheckers : ExpressionCheckers() { + override val expressionCheckers: List + get() = _expressionCheckers + override val qualifiedAccessCheckers: List + get() = _qualifiedAccessCheckers + override val functionCallCheckers: List + get() = _functionCallCheckers + + private val _expressionCheckers: MutableList = mutableListOf() + private val _qualifiedAccessCheckers: MutableList = mutableListOf() + private val _functionCallCheckers: MutableList = mutableListOf() + + fun register(checkers: ExpressionCheckers) { + _expressionCheckers += checkers.allExpressionCheckers + _qualifiedAccessCheckers += checkers.allQualifiedAccessCheckers + _functionCallCheckers += checkers.allFunctionCallCheckers + } +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/CallCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/CallCheckers.kt index 798ec5c3b1e..54241a332a3 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/CallCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/CallCheckers.kt @@ -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 = emptyList() + open val qualifiedAccessCheckers: List = emptyList() + open val functionCallCheckers: List = emptyList() -object CallCheckers { - val EXPRESSIONS: List> = listOf() - - val QUALIFIED_ACCESS: List = listOf( - FirSuperNotAvailableChecker, - FirNotASupertypeChecker, - FirSuperclassNotAccessibleFromInterfaceChecker, - FirAbstractSuperCallChecker, - FirQualifiedSupertypeExtendedByOtherSupertypeChecker, - ) + EXPRESSIONS - - val FUNCTION_CALLS: List = listOf( - - ) + QUALIFIED_ACCESS + internal val allExpressionCheckers get() = expressionCheckers + internal val allQualifiedAccessCheckers get() = qualifiedAccessCheckers + allExpressionCheckers + internal val allFunctionCallCheckers get() = functionCallCheckers + allQualifiedAccessCheckers } \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/DefaultExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/DefaultExpressionCheckers.kt new file mode 100644 index 00000000000..c299a11cded --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/DefaultExpressionCheckers.kt @@ -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 = listOf() + override val qualifiedAccessCheckers: List = listOf( + FirSuperNotAvailableChecker, + FirNotASupertypeChecker, + FirSuperclassNotAccessibleFromInterfaceChecker, + FirAbstractSuperCallChecker, + FirQualifiedSupertypeExtendedByOtherSupertypeChecker, + ) + override val functionCallCheckers: List = listOf() +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/FirExpressionChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/FirExpressionChecker.kt index b3ea1d0367b..b5916b62b9c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/FirExpressionChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/FirExpressionChecker.kt @@ -15,5 +15,6 @@ abstract class FirExpressionChecker { abstract fun check(functionCall: E, context: CheckerContext, reporter: DiagnosticReporter) } +typealias FirBasicExpresionChecker = FirExpressionChecker +typealias FirQualifiedAccessChecker = FirExpressionChecker typealias FirFunctionCallChecker = FirExpressionChecker -typealias FirQualifiedAccessChecker = FirExpressionChecker \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DeclarationCheckers.kt index 354a382a1a2..359137a2a54 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DeclarationCheckers.kt @@ -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 = emptyList() + open val memberDeclarationCheckers: List = emptyList() + open val constructorCheckers: List = emptyList() -object DeclarationCheckers { - val DECLARATIONS: List> = listOf( - FirModifierChecker - ) - val MEMBER_DECLARATIONS: List> = DECLARATIONS + listOf( - FirAnnotationClassDeclarationChecker, - FirInfixFunctionDeclarationChecker, - FirExposedVisibilityChecker - ) - val CONSTRUCTORS: List> = MEMBER_DECLARATIONS + listOf( - FirConstructorChecker - ) -} \ No newline at end of file + internal val allMemberDeclarationCheckers: List get() = memberDeclarationCheckers + declarationCheckers + internal val allConstructorCheckers: List get() = constructorCheckers + allMemberDeclarationCheckers +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DefaultDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DefaultDeclarationCheckers.kt new file mode 100644 index 00000000000..97da78334dc --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/DefaultDeclarationCheckers.kt @@ -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 = listOf( + FirAnnotationClassDeclarationChecker, + FirModifierChecker + ) + + override val memberDeclarationCheckers: List = listOf( + FirInfixFunctionDeclarationChecker, + FirExposedVisibilityChecker + ) + + override val constructorCheckers: List = listOf( + FirConstructorAllowedChecker + ) +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationClassDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationClassDeclarationChecker.kt index 8eb93cc5248..f8b96dbc1aa 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationClassDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationClassDeclarationChecker.kt @@ -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() { +object FirAnnotationClassDeclarationChecker : FirBasicDeclarationChecker() { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { if (declaration !is FirRegularClass) return if (declaration.classKind != ANNOTATION_CLASS) return diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt similarity index 97% rename from compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorChecker.kt rename to compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt index 016ea703713..18cb7f61f60 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt @@ -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() { +object FirConstructorAllowedChecker : FirConstructorChecker() { override fun check(declaration: FirConstructor, context: CheckerContext, reporter: DiagnosticReporter) { val containingClass = context.containingDeclarations.lastOrNull() as? FirClass<*> ?: return val source = declaration.source diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationChecker.kt index 79116e29818..c3083a15870 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationChecker.kt @@ -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 { abstract fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter) -} \ No newline at end of file +} + +typealias FirBasicDeclarationChecker = FirDeclarationChecker +typealias FirMemberDeclarationChecker = FirDeclarationChecker +typealias FirConstructorChecker = FirDeclarationChecker diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt index a0998c6b6ed..fbf181bfa6e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt @@ -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() { +object FirExposedVisibilityChecker : FirMemberDeclarationChecker() { override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { when (declaration) { is FirTypeAlias -> checkTypeAlias(declaration, reporter) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInfixFunctionDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInfixFunctionDeclarationChecker.kt index 39dd953ff76..4b643cb0ca2 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInfixFunctionDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInfixFunctionDeclarationChecker.kt @@ -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() { +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)) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt index 6df15a0805c..bd022424738 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt @@ -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() { +object FirModifierChecker : FirBasicDeclarationChecker() { private enum class CompatibilityType { COMPATIBLE, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/AbstractDiagnosticCollectorComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/AbstractDiagnosticCollectorComponent.kt index 7719d753428..5d1f251d766 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/AbstractDiagnosticCollectorComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/AbstractDiagnosticCollectorComponent.kt @@ -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() { + protected val session: FirSession = collector.session + override fun visitElement(element: FirElement, data: CheckerContext) {} protected fun runCheck(block: (DiagnosticReporter) -> Unit) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt index 08d4007a76a..b624f9cd58f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt @@ -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 List>.check( diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt index a6cf73cf86e..7331f4ec50f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt @@ -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 visitConstExpression(constExpression: FirConstExpression, 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 List>.check(expression: E, context: CheckerContext, reporter: DiagnosticReporter) { diff --git a/compiler/fir/java/build.gradle.kts b/compiler/fir/java/build.gradle.kts index b7eaf928c9d..633bb9f341e 100644 --- a/compiler/fir/java/build.gradle.kts +++ b/compiler/fir/java/build.gradle.kts @@ -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") } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt index ed57ba5392a..70d4eee460f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt @@ -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)) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt index 9463c0da770..f23357a3301 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt @@ -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() + ) } } \ No newline at end of file