[FIR] Add specific checkers for each leaf expression type

This commit is contained in:
Dmitriy Novozhilov
2021-06-30 13:05:04 +03:00
committed by TeamCityServer
parent d3ba821371
commit 1f1065d858
5 changed files with 70 additions and 7 deletions
@@ -46,6 +46,13 @@ fun main(args: Array<String>) {
alias<FirStringConcatenationCall>("StringConcatenationCallChecker")
alias<FirTypeOperatorCall>("TypeOperatorCallChecker")
alias<FirResolvedQualifier>("ResolvedQualifierChecker")
alias<FirConstExpression<*>>("ConstExpressionChecker")
alias<FirCallableReferenceAccess>("CallableReferenceAccessChecker")
alias<FirThisReceiverExpression>("ThisReceiverExpressionChecker")
alias<FirWhileLoop>("WhileLoopChecker")
alias<FirDoWhileLoop>("DoWhileLoopChecker")
alias<FirArrayOfCall>("ArrayOfCallChecker")
alias<FirClassReferenceExpression>("ClassReferenceExpressionChecker")
}
val declarationPackage = "$basePackage.checkers.declaration"
@@ -53,6 +53,20 @@ class ComposedExpressionCheckers : ExpressionCheckers() {
get() = _typeOperatorCallCheckers
override val resolvedQualifierCheckers: Set<FirResolvedQualifierChecker>
get() = _resolvedQualifierCheckers
override val constExpressionCheckers: Set<FirConstExpressionChecker>
get() = _constExpressionCheckers
override val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker>
get() = _callableReferenceAccessCheckers
override val thisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker>
get() = _thisReceiverExpressionCheckers
override val whileLoopCheckers: Set<FirWhileLoopChecker>
get() = _whileLoopCheckers
override val doWhileLoopCheckers: Set<FirDoWhileLoopChecker>
get() = _doWhileLoopCheckers
override val arrayOfCallCheckers: Set<FirArrayOfCallChecker>
get() = _arrayOfCallCheckers
override val classReferenceExpressionCheckers: Set<FirClassReferenceExpressionChecker>
get() = _classReferenceExpressionCheckers
private val _basicExpressionCheckers: MutableSet<FirBasicExpressionChecker> = mutableSetOf()
private val _qualifiedAccessCheckers: MutableSet<FirQualifiedAccessChecker> = mutableSetOf()
@@ -74,6 +88,13 @@ class ComposedExpressionCheckers : ExpressionCheckers() {
private val _stringConcatenationCallCheckers: MutableSet<FirStringConcatenationCallChecker> = mutableSetOf()
private val _typeOperatorCallCheckers: MutableSet<FirTypeOperatorCallChecker> = mutableSetOf()
private val _resolvedQualifierCheckers: MutableSet<FirResolvedQualifierChecker> = mutableSetOf()
private val _constExpressionCheckers: MutableSet<FirConstExpressionChecker> = mutableSetOf()
private val _callableReferenceAccessCheckers: MutableSet<FirCallableReferenceAccessChecker> = mutableSetOf()
private val _thisReceiverExpressionCheckers: MutableSet<FirThisReceiverExpressionChecker> = mutableSetOf()
private val _whileLoopCheckers: MutableSet<FirWhileLoopChecker> = mutableSetOf()
private val _doWhileLoopCheckers: MutableSet<FirDoWhileLoopChecker> = mutableSetOf()
private val _arrayOfCallCheckers: MutableSet<FirArrayOfCallChecker> = mutableSetOf()
private val _classReferenceExpressionCheckers: MutableSet<FirClassReferenceExpressionChecker> = 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
}
}
@@ -37,6 +37,13 @@ abstract class ExpressionCheckers {
open val stringConcatenationCallCheckers: Set<FirStringConcatenationCallChecker> = emptySet()
open val typeOperatorCallCheckers: Set<FirTypeOperatorCallChecker> = emptySet()
open val resolvedQualifierCheckers: Set<FirResolvedQualifierChecker> = emptySet()
open val constExpressionCheckers: Set<FirConstExpressionChecker> = emptySet()
open val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> = emptySet()
open val thisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker> = emptySet()
open val whileLoopCheckers: Set<FirWhileLoopChecker> = emptySet()
open val doWhileLoopCheckers: Set<FirDoWhileLoopChecker> = emptySet()
open val arrayOfCallCheckers: Set<FirArrayOfCallChecker> = emptySet()
open val classReferenceExpressionCheckers: Set<FirClassReferenceExpressionChecker> = emptySet()
@CheckersComponentInternal internal val allBasicExpressionCheckers: Set<FirBasicExpressionChecker> get() = basicExpressionCheckers
@CheckersComponentInternal internal val allQualifiedAccessCheckers: Set<FirQualifiedAccessChecker> get() = qualifiedAccessCheckers + basicExpressionCheckers
@@ -58,4 +65,11 @@ abstract class ExpressionCheckers {
@CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set<FirStringConcatenationCallChecker> get() = stringConcatenationCallCheckers + basicExpressionCheckers
@CheckersComponentInternal internal val allTypeOperatorCallCheckers: Set<FirTypeOperatorCallChecker> get() = typeOperatorCallCheckers + basicExpressionCheckers
@CheckersComponentInternal internal val allResolvedQualifierCheckers: Set<FirResolvedQualifierChecker> get() = resolvedQualifierCheckers + basicExpressionCheckers
@CheckersComponentInternal internal val allConstExpressionCheckers: Set<FirConstExpressionChecker> get() = constExpressionCheckers + basicExpressionCheckers
@CheckersComponentInternal internal val allCallableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> get() = callableReferenceAccessCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers
@CheckersComponentInternal internal val allThisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker> get() = thisReceiverExpressionCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers
@CheckersComponentInternal internal val allWhileLoopCheckers: Set<FirWhileLoopChecker> get() = whileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers
@CheckersComponentInternal internal val allDoWhileLoopCheckers: Set<FirDoWhileLoopChecker> get() = doWhileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers
@CheckersComponentInternal internal val allArrayOfCallCheckers: Set<FirArrayOfCallChecker> get() = arrayOfCallCheckers + basicExpressionCheckers
@CheckersComponentInternal internal val allClassReferenceExpressionCheckers: Set<FirClassReferenceExpressionChecker> get() = classReferenceExpressionCheckers + basicExpressionCheckers
}
@@ -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<FirStatement>
typealias FirQualifiedAccessChecker = FirExpressionChecker<FirQualifiedAccess>
@@ -51,3 +58,10 @@ typealias FirEqualityOperatorCallChecker = FirExpressionChecker<FirEqualityOpera
typealias FirStringConcatenationCallChecker = FirExpressionChecker<FirStringConcatenationCall>
typealias FirTypeOperatorCallChecker = FirExpressionChecker<FirTypeOperatorCall>
typealias FirResolvedQualifierChecker = FirExpressionChecker<FirResolvedQualifier>
typealias FirConstExpressionChecker = FirExpressionChecker<FirConstExpression<*>>
typealias FirCallableReferenceAccessChecker = FirExpressionChecker<FirCallableReferenceAccess>
typealias FirThisReceiverExpressionChecker = FirExpressionChecker<FirThisReceiverExpression>
typealias FirWhileLoopChecker = FirExpressionChecker<FirWhileLoop>
typealias FirDoWhileLoopChecker = FirExpressionChecker<FirDoWhileLoop>
typealias FirArrayOfCallChecker = FirExpressionChecker<FirArrayOfCall>
typealias FirClassReferenceExpressionChecker = FirExpressionChecker<FirClassReferenceExpression>
@@ -26,7 +26,7 @@ class ExpressionCheckersDiagnosticComponent(
}
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, 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) {