[FIR] Create session component with registered checkers
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
+7
-15
@@ -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
|
||||
}
|
||||
+18
@@ -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()
|
||||
}
|
||||
+2
-1
@@ -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>
|
||||
+7
-16
@@ -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
|
||||
}
|
||||
|
||||
+22
@@ -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
|
||||
)
|
||||
}
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
-1
@@ -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>
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+1
-1
@@ -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)) {
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+3
@@ -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) {
|
||||
|
||||
+16
-14
@@ -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(
|
||||
|
||||
+19
-17
@@ -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) {
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user