[FIR] Part 1. Group checkers by the MPP kind

This commit introduces MppChecker kind, which represents the new property
  of checkers
- `MppCheckerKind.Common` means that this checker should run from the same
  session to which corresponding declaration belongs
- `MppCheckerKind.Platform` means that in case of MPP compilation this
  checker should run with session of leaf platform module for sources
  of all modules

An example of a platform checker is a checker that checks class scopes
  and reports ABSTRACT_NOT_IMPLEMENTED and similar diagnostics. If some
  regular class in the common module contains expect supertypes, the
  checker should consider the actualization of those supertypes to get
  a complete type scope

^KT-58881
This commit is contained in:
Dmitriy Novozhilov
2024-01-08 14:37:30 +02:00
committed by Nikolay Lunyak
parent ff063f553e
commit 727d2f46f8
338 changed files with 1216 additions and 728 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.web.common.checkers.declaration
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.checkers.isTopLevel
@@ -16,7 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
import org.jetbrains.kotlin.name.WebCommonStandardClassIds
object FirJsExportAnnotationChecker : FirBasicDeclarationChecker() {
object FirJsExportAnnotationChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
val jsExport = declaration.getAnnotationByClassId(WebCommonStandardClassIds.Annotations.JsExport, context.session) ?: return
@@ -24,4 +25,4 @@ object FirJsExportAnnotationChecker : FirBasicDeclarationChecker() {
reporter.reportOn(jsExport.source, FirWebCommonErrors.NESTED_JS_EXPORT, context)
}
}
}
}
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
abstract class FirWebCommonExternalChecker : FirBasicDeclarationChecker() {
abstract class FirWebCommonExternalChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) {
abstract fun isNativeOrEffectivelyExternal(symbol: FirBasedSymbol<*>, session: FirSession): Boolean
abstract fun reportExternalEnum(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter)
@@ -253,4 +253,4 @@ abstract class FirWebCommonExternalChecker : FirBasicDeclarationChecker() {
?.calleeReference?.toResolvedPropertySymbol() ?: return false
return isDefinedExternallyCallableId(declaration.callableId)
}
}
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.web.common.checkers.expression
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirBasicExpressionChecker
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
@@ -19,7 +20,7 @@ import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
abstract class FirAbstractNativeRttiChecker(
private val webCheckerUtils: FirAbstractWebCheckerUtils
) : FirBasicExpressionChecker() {
) : FirBasicExpressionChecker(MppCheckerKind.Common) {
override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) {
when (expression) {
is FirGetClassCall -> checkGetClassCall(expression, context, reporter)
@@ -65,4 +66,4 @@ abstract class FirAbstractNativeRttiChecker(
else -> {}
}
}
}
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.web.common.checkers.expression
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChecker
import org.jetbrains.kotlin.fir.analysis.diagnostics.web.common.FirWebCommonErrors
@@ -17,7 +18,7 @@ import org.jetbrains.kotlin.fir.types.toSymbol
abstract class FirAbstractReifiedExternalChecker(
private val webCheckerUtils: FirAbstractWebCheckerUtils
) : FirFunctionCallChecker() {
) : FirFunctionCallChecker(MppCheckerKind.Common) {
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
expression.forAllReifiedTypeParameters { type, typeArgument ->
val typeSymbol = type.toSymbol(context.session)
@@ -31,4 +32,4 @@ abstract class FirAbstractReifiedExternalChecker(
}
}
}
}
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.analysis.web.common.checkers.expression
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.canBeEvaluatedAtCompileTime
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChecker
@@ -23,7 +24,7 @@ import org.jetbrains.kotlin.fir.types.resolvedType
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.WebCommonStandardClassIds
object FirJsCodeConstantArgumentChecker : FirFunctionCallChecker() {
object FirJsCodeConstantArgumentChecker : FirFunctionCallChecker(MppCheckerKind.Common) {
private val jsCodeCallableId = WebCommonStandardClassIds.Callables.Js
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.web.common.checkers.expression
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirAnnotationCallChecker
import org.jetbrains.kotlin.fir.analysis.diagnostics.web.common.FirWebCommonErrors
@@ -16,7 +17,7 @@ import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.js.validateQualifier
import org.jetbrains.kotlin.name.WebCommonStandardClassIds.Annotations.JsQualifier
object FirJsQualifierChecker : FirAnnotationCallChecker() {
object FirJsQualifierChecker : FirAnnotationCallChecker(MppCheckerKind.Common) {
override fun check(expression: FirAnnotationCall, context: CheckerContext, reporter: DiagnosticReporter) {
if (expression.toAnnotationClassId(context.session) != JsQualifier) {
return