From f6a23ea441dd5acc95c8149bc8c927092b68aa0f Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 27 Feb 2020 15:08:33 +0300 Subject: [PATCH] [FIR] Add infrastructure for call checkers --- .../diagnostics/checkers/call/CallCheckers.kt | 14 ++++ .../checkers/call/FirCallChecker.kt | 13 --- .../checkers/call/FirExpressionChecker.kt | 18 ++++ .../collectors/AbstractDiagnosticCollector.kt | 4 +- .../ExpressionCheckersDiagnosticComponent.kt | 84 +++++++++++++++++++ 5 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/CallCheckers.kt delete mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/FirCallChecker.kt create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/FirExpressionChecker.kt create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/collectors/components/ExpressionCheckersDiagnosticComponent.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/CallCheckers.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/CallCheckers.kt new file mode 100644 index 00000000000..382d9483da6 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/CallCheckers.kt @@ -0,0 +1,14 @@ +/* + * 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.resolve.diagnostics.checkers.call + +import org.jetbrains.kotlin.fir.expressions.FirExpression + +object CallCheckers { + val EXPRESSIONS: List> = listOf() + val QUALIFIED_ACCESS: List = listOf() + EXPRESSIONS + val FUNCTION_CALLS: List = listOf() + QUALIFIED_ACCESS +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/FirCallChecker.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/FirCallChecker.kt deleted file mode 100644 index 5623789a145..00000000000 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/FirCallChecker.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright 2010-2019 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.resolve.diagnostics.checkers.call - -import org.jetbrains.kotlin.fir.expressions.FirFunctionCall -import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter - -abstract class FirCallChecker { - abstract fun check(functionCall: FirFunctionCall, reporter: DiagnosticReporter) -} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/FirExpressionChecker.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/FirExpressionChecker.kt new file mode 100644 index 00000000000..ddb5df51db6 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/checkers/call/FirExpressionChecker.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2019 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.resolve.diagnostics.checkers.call + +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression +import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter + +abstract class FirExpressionChecker { + abstract fun check(functionCall: E, reporter: DiagnosticReporter) +} + +typealias FirFunctionCallChecker = FirExpressionChecker +typealias FirQualifiedAccessChecker = FirExpressionChecker \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/collectors/AbstractDiagnosticCollector.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/collectors/AbstractDiagnosticCollector.kt index f73e52d8216..b058cafce46 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/collectors/AbstractDiagnosticCollector.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/collectors/AbstractDiagnosticCollector.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.components.AbstractDiagnosticCollectorComponent +import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.components.ExpressionCheckersDiagnosticComponent import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.components.DeclarationCheckersDiagnosticComponent import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.components.ErrorNodeDiagnosticCollectorComponent import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid @@ -57,6 +58,7 @@ abstract class AbstractDiagnosticCollector { fun AbstractDiagnosticCollector.registerAllComponents() { initializeComponents( DeclarationCheckersDiagnosticComponent(this), - ErrorNodeDiagnosticCollectorComponent(this) + ExpressionCheckersDiagnosticComponent(this), + ErrorNodeDiagnosticCollectorComponent(this), ) } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/collectors/components/ExpressionCheckersDiagnosticComponent.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/collectors/components/ExpressionCheckersDiagnosticComponent.kt new file mode 100644 index 00000000000..e15e3c03e15 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/collectors/components/ExpressionCheckersDiagnosticComponent.kt @@ -0,0 +1,84 @@ +/* + * 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.resolve.diagnostics.collectors.components + +import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.resolve.diagnostics.checkers.call.CallCheckers +import org.jetbrains.kotlin.fir.resolve.diagnostics.checkers.call.FirExpressionChecker +import org.jetbrains.kotlin.fir.resolve.diagnostics.collectors.AbstractDiagnosticCollector + +class ExpressionCheckersDiagnosticComponent(collector: AbstractDiagnosticCollector) : AbstractDiagnosticCollectorComponent(collector) { + override fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall) { + runCheck { CallCheckers.EXPRESSIONS.check(typeOperatorCall, it) } + } + + override fun visitConstExpression(constExpression: FirConstExpression) { + runCheck { CallCheckers.EXPRESSIONS.check(constExpression, it) } + } + + override fun visitAnnotationCall(annotationCall: FirAnnotationCall) { + runCheck { CallCheckers.EXPRESSIONS.check(annotationCall, it) } + } + + override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) { + runCheck { CallCheckers.QUALIFIED_ACCESS.check(qualifiedAccessExpression, it) } + } + + override fun visitFunctionCall(functionCall: FirFunctionCall) { + runCheck { CallCheckers.FUNCTION_CALLS.check(functionCall, it) } + } + + override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) { + runCheck { CallCheckers.QUALIFIED_ACCESS.check(callableReferenceAccess, it) } + } + + override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression) { + runCheck { CallCheckers.EXPRESSIONS.check(thisReceiverExpression, it) } + } + + override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) { + runCheck { CallCheckers.EXPRESSIONS.check(resolvedQualifier, it) } + } + + override fun visitWhenExpression(whenExpression: FirWhenExpression) { + runCheck { CallCheckers.EXPRESSIONS.check(whenExpression, it) } + } + + override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression) { + runCheck { CallCheckers.EXPRESSIONS.check(binaryLogicExpression, it) } + } + + override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall) { + runCheck { CallCheckers.EXPRESSIONS.check(arrayOfCall, it) } + } + + override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall) { + runCheck { CallCheckers.EXPRESSIONS.check(stringConcatenationCall, it) } + } + + override fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall) { + runCheck { CallCheckers.EXPRESSIONS.check(checkNotNullCall, it) } + } + + override fun visitTryExpression(tryExpression: FirTryExpression) { + runCheck { CallCheckers.EXPRESSIONS.check(tryExpression, it) } + } + + override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression) { + runCheck { CallCheckers.EXPRESSIONS.check(classReferenceExpression, it) } + } + + override fun visitGetClassCall(getClassCall: FirGetClassCall) { + runCheck { CallCheckers.EXPRESSIONS.check(getClassCall, it) } + } + + private fun List>.check(expression: E, reporter: DiagnosticReporter) { + for (checker in this) { + checker.check(expression, reporter) + } + } +} \ No newline at end of file