From 1f1065d85850a2b6e4d48b0c4568367d4c5640a5 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 30 Jun 2021 13:05:04 +0300 Subject: [PATCH] [FIR] Add specific checkers for each leaf expression type --- .../kotlin/fir/checkers/generator/Main.kt | 7 +++++ .../expression/ComposedExpressionCheckers.kt | 28 +++++++++++++++++++ .../checkers/expression/ExpressionCheckers.kt | 14 ++++++++++ .../expression/FirExpressionCheckerAliases.kt | 14 ++++++++++ .../ExpressionCheckersDiagnosticComponent.kt | 14 +++++----- 5 files changed, 70 insertions(+), 7 deletions(-) diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt index 9bd6933af69..1901fc9de3c 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt @@ -46,6 +46,13 @@ fun main(args: Array) { alias("StringConcatenationCallChecker") alias("TypeOperatorCallChecker") alias("ResolvedQualifierChecker") + alias>("ConstExpressionChecker") + alias("CallableReferenceAccessChecker") + alias("ThisReceiverExpressionChecker") + alias("WhileLoopChecker") + alias("DoWhileLoopChecker") + alias("ArrayOfCallChecker") + alias("ClassReferenceExpressionChecker") } val declarationPackage = "$basePackage.checkers.declaration" diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt index ba19d0701bc..6e0a9520cf5 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt @@ -53,6 +53,20 @@ class ComposedExpressionCheckers : ExpressionCheckers() { get() = _typeOperatorCallCheckers override val resolvedQualifierCheckers: Set get() = _resolvedQualifierCheckers + override val constExpressionCheckers: Set + get() = _constExpressionCheckers + override val callableReferenceAccessCheckers: Set + get() = _callableReferenceAccessCheckers + override val thisReceiverExpressionCheckers: Set + get() = _thisReceiverExpressionCheckers + override val whileLoopCheckers: Set + get() = _whileLoopCheckers + override val doWhileLoopCheckers: Set + get() = _doWhileLoopCheckers + override val arrayOfCallCheckers: Set + get() = _arrayOfCallCheckers + override val classReferenceExpressionCheckers: Set + get() = _classReferenceExpressionCheckers private val _basicExpressionCheckers: MutableSet = mutableSetOf() private val _qualifiedAccessCheckers: MutableSet = mutableSetOf() @@ -74,6 +88,13 @@ class ComposedExpressionCheckers : ExpressionCheckers() { private val _stringConcatenationCallCheckers: MutableSet = mutableSetOf() private val _typeOperatorCallCheckers: MutableSet = mutableSetOf() private val _resolvedQualifierCheckers: MutableSet = mutableSetOf() + private val _constExpressionCheckers: MutableSet = mutableSetOf() + private val _callableReferenceAccessCheckers: MutableSet = mutableSetOf() + private val _thisReceiverExpressionCheckers: MutableSet = mutableSetOf() + private val _whileLoopCheckers: MutableSet = mutableSetOf() + private val _doWhileLoopCheckers: MutableSet = mutableSetOf() + private val _arrayOfCallCheckers: MutableSet = mutableSetOf() + private val _classReferenceExpressionCheckers: MutableSet = mutableSetOf() @CheckersComponentInternal fun register(checkers: ExpressionCheckers) { @@ -97,5 +118,12 @@ class ComposedExpressionCheckers : ExpressionCheckers() { _stringConcatenationCallCheckers += checkers.stringConcatenationCallCheckers _typeOperatorCallCheckers += checkers.typeOperatorCallCheckers _resolvedQualifierCheckers += checkers.resolvedQualifierCheckers + _constExpressionCheckers += checkers.constExpressionCheckers + _callableReferenceAccessCheckers += checkers.callableReferenceAccessCheckers + _thisReceiverExpressionCheckers += checkers.thisReceiverExpressionCheckers + _whileLoopCheckers += checkers.whileLoopCheckers + _doWhileLoopCheckers += checkers.doWhileLoopCheckers + _arrayOfCallCheckers += checkers.arrayOfCallCheckers + _classReferenceExpressionCheckers += checkers.classReferenceExpressionCheckers } } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt index b5ee3f41226..429cdbb936a 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt @@ -37,6 +37,13 @@ abstract class ExpressionCheckers { open val stringConcatenationCallCheckers: Set = emptySet() open val typeOperatorCallCheckers: Set = emptySet() open val resolvedQualifierCheckers: Set = emptySet() + open val constExpressionCheckers: Set = emptySet() + open val callableReferenceAccessCheckers: Set = emptySet() + open val thisReceiverExpressionCheckers: Set = emptySet() + open val whileLoopCheckers: Set = emptySet() + open val doWhileLoopCheckers: Set = emptySet() + open val arrayOfCallCheckers: Set = emptySet() + open val classReferenceExpressionCheckers: Set = emptySet() @CheckersComponentInternal internal val allBasicExpressionCheckers: Set get() = basicExpressionCheckers @CheckersComponentInternal internal val allQualifiedAccessCheckers: Set get() = qualifiedAccessCheckers + basicExpressionCheckers @@ -58,4 +65,11 @@ abstract class ExpressionCheckers { @CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set get() = stringConcatenationCallCheckers + basicExpressionCheckers @CheckersComponentInternal internal val allTypeOperatorCallCheckers: Set get() = typeOperatorCallCheckers + basicExpressionCheckers @CheckersComponentInternal internal val allResolvedQualifierCheckers: Set get() = resolvedQualifierCheckers + basicExpressionCheckers + @CheckersComponentInternal internal val allConstExpressionCheckers: Set get() = constExpressionCheckers + basicExpressionCheckers + @CheckersComponentInternal internal val allCallableReferenceAccessCheckers: Set get() = callableReferenceAccessCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers + @CheckersComponentInternal internal val allThisReceiverExpressionCheckers: Set get() = thisReceiverExpressionCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers + @CheckersComponentInternal internal val allWhileLoopCheckers: Set get() = whileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers + @CheckersComponentInternal internal val allDoWhileLoopCheckers: Set get() = doWhileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers + @CheckersComponentInternal internal val allArrayOfCallCheckers: Set get() = arrayOfCallCheckers + basicExpressionCheckers + @CheckersComponentInternal internal val allClassReferenceExpressionCheckers: Set get() = classReferenceExpressionCheckers + basicExpressionCheckers } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt index c439c012fe1..bfb907fabbb 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt @@ -11,9 +11,14 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression */ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall +import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression +import org.jetbrains.kotlin.fir.expressions.FirConstExpression +import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop import org.jetbrains.kotlin.fir.expressions.FirElvisExpression import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall @@ -26,10 +31,12 @@ import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall +import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirTryExpression import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirWhenExpression +import org.jetbrains.kotlin.fir.expressions.FirWhileLoop typealias FirBasicExpressionChecker = FirExpressionChecker typealias FirQualifiedAccessChecker = FirExpressionChecker @@ -51,3 +58,10 @@ typealias FirEqualityOperatorCallChecker = FirExpressionChecker typealias FirTypeOperatorCallChecker = FirExpressionChecker typealias FirResolvedQualifierChecker = FirExpressionChecker +typealias FirConstExpressionChecker = FirExpressionChecker> +typealias FirCallableReferenceAccessChecker = FirExpressionChecker +typealias FirThisReceiverExpressionChecker = FirExpressionChecker +typealias FirWhileLoopChecker = FirExpressionChecker +typealias FirDoWhileLoopChecker = FirExpressionChecker +typealias FirArrayOfCallChecker = FirExpressionChecker +typealias FirClassReferenceExpressionChecker = FirExpressionChecker 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 0dd08b65a50..2c5ec5c5dcb 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 @@ -26,7 +26,7 @@ class ExpressionCheckersDiagnosticComponent( } override fun visitConstExpression(constExpression: FirConstExpression, data: CheckerContext) { - checkers.allBasicExpressionCheckers.check(constExpression, data, reporter) + checkers.allConstExpressionCheckers.check(constExpression, data, reporter) } override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: CheckerContext) { @@ -42,11 +42,11 @@ class ExpressionCheckersDiagnosticComponent( } override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: CheckerContext) { - checkers.allQualifiedAccessExpressionCheckers.check(callableReferenceAccess, data, reporter) + checkers.allCallableReferenceAccessCheckers.check(callableReferenceAccess, data, reporter) } override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: CheckerContext) { - checkers.allBasicExpressionCheckers.check(thisReceiverExpression, data, reporter) + checkers.allThisReceiverExpressionCheckers.check(thisReceiverExpression, data, reporter) } override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: CheckerContext) { @@ -58,11 +58,11 @@ class ExpressionCheckersDiagnosticComponent( } override fun visitWhileLoop(whileLoop: FirWhileLoop, data: CheckerContext) { - checkers.allLoopExpressionCheckers.check(whileLoop, data, reporter) + checkers.allWhileLoopCheckers.check(whileLoop, data, reporter) } override fun visitDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: CheckerContext) { - checkers.allLoopExpressionCheckers.check(doWhileLoop, data, reporter) + checkers.allDoWhileLoopCheckers.check(doWhileLoop, data, reporter) } override fun visitErrorLoop(errorLoop: FirErrorLoop, data: CheckerContext) { @@ -74,7 +74,7 @@ class ExpressionCheckersDiagnosticComponent( } override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: CheckerContext) { - checkers.allBasicExpressionCheckers.check(arrayOfCall, data, reporter) + checkers.allArrayOfCallCheckers.check(arrayOfCall, data, reporter) } override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: CheckerContext) { @@ -98,7 +98,7 @@ class ExpressionCheckersDiagnosticComponent( } override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: CheckerContext) { - checkers.allBasicExpressionCheckers.check(classReferenceExpression, data, reporter) + checkers.allClassReferenceExpressionCheckers.check(classReferenceExpression, data, reporter) } override fun visitGetClassCall(getClassCall: FirGetClassCall, data: CheckerContext) {