FIR checkers: reuse CheckerContext.containingFile & isTopLevel

This commit is contained in:
Mikhail Glukhikh
2023-01-09 18:05:19 +01:00
committed by teamcity
parent a60eab7b47
commit f0dbe1ad2d
9 changed files with 14 additions and 26 deletions
@@ -14,11 +14,9 @@ import org.jetbrains.kotlin.fir.analysis.js.checkers.isNativeObject
import org.jetbrains.kotlin.fir.analysis.checkers.isTopLevel
import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.fullyExpandedClassId
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.name.JsStandardClassIds
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
object FirJsExternalFileChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -28,8 +26,7 @@ object FirJsExternalFileChecker : FirBasicDeclarationChecker() {
return
}
val targetAnnotations = context.containingDeclarations
.lastIsInstanceOrNull<FirFile>()
val targetAnnotations = context.containingFile
?.annotations
?.firstOrNull { it.fullyExpandedClassId(context.session) in JsStandardClassIds.Annotations.annotationsRequiringExternal }
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.analysis.js.checkers.isNativeObject
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsModule
import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsNonModule
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
object FirJsModuleChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -33,12 +32,8 @@ object FirJsModuleChecker : FirBasicDeclarationChecker() {
reporter.reportOn(declaration.source, FirJsErrors.JS_MODULE_PROHIBITED_ON_NON_NATIVE, context)
}
if (context.isTopLevel) {
val file = context.containingDeclarations.lastIsInstanceOrNull<FirFile>()
if (file != null && file.isEitherModuleOrNonModule(context.session)) {
reporter.reportOn(declaration.source, FirJsErrors.NESTED_JS_MODULE_PROHIBITED, context)
}
if (context.isTopLevel && context.containingFile?.isEitherModuleOrNonModule(context.session) == true) {
reporter.reportOn(declaration.source, FirJsErrors.NESTED_JS_MODULE_PROHIBITED, context)
}
}
@@ -16,13 +16,11 @@ import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.classKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirPropertyChecker
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.needsMultiFieldValueClassFlattening
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingDeclarationSymbol
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
import org.jetbrains.kotlin.fir.declarations.utils.*
@@ -131,7 +129,7 @@ object FirJvmFieldApplicabilityChecker : FirPropertyChecker() {
}
private fun isInsideJvmMultifileClassFile(context: CheckerContext): Boolean {
return context.findClosest<FirFile>()?.annotations?.any {
return context.containingFile?.annotations?.any {
it.annotationTypeRef.coneType.classId == JVM_MULTIFILE_CLASS_ID
} == true
}
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.fir.analysis.native.checkers
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
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
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
@@ -48,7 +48,7 @@ object FirNativeSharedImmutableChecker : FirBasicDeclarationChecker() {
if (declaration.source?.kind is KtFakeSourceElementKind) return
if (context.containingDeclarations.lastOrNull() !is FirFile) {
if (!context.isTopLevel) {
reporter.reportIfHasAnnotation(
declaration,
sharedImmutableClassId,
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
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
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.hasBackingField
@@ -29,7 +30,7 @@ object FirNativeThreadLocalChecker : FirBasicDeclarationChecker() {
if (declaration.source?.kind is KtFakeSourceElementKind) return
if (context.containingDeclarations.lastOrNull() !is FirFile && !isObject) {
if (!context.isTopLevel && !isObject) {
reporter.reportIfHasAnnotation(declaration, threadLocalClassId, FirNativeErrors.INAPPLICABLE_THREAD_LOCAL_TOP_LEVEL, context)
}
}
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.analysis.checkers.*
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.fromPrimaryConstructor
@@ -237,7 +236,7 @@ object FirAnnotationChecker : FirBasicDeclarationChecker() {
context: CheckerContext,
reporter: DiagnosticReporter
) {
val closestFirFile = context.findClosest<FirFile>()
val closestFirFile = context.containingFile
if (closestFirFile != null && !closestFirFile.packageFqName.startsWith(StandardClassIds.BASE_KOTLIN_PACKAGE.shortName())) {
reporter.reportOn(
deprecatedSinceKotlin.source,
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirOptInUsageBaseChecker
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirOptInUsageBaseChecker.Experimentality
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
@@ -159,7 +158,7 @@ object FirOverrideChecker : FirClassChecker() {
}
if (this is FirPropertyAccessorSymbol) return
val file = context.findClosest<FirFile>() ?: return
val file = context.containingFile ?: return
val containingDeclarations = context.containingDeclarations + containingClass
val visibilityChecker = context.session.visibilityChecker
val hasVisibleBase = overriddenSymbols.any {
@@ -270,7 +269,7 @@ object FirOverrideChecker : FirClassChecker() {
if (kind !is KtRealSourceElementKind && kind !is KtFakeSourceElementKind.PropertyFromParameter) return
val visibilityChecker = context.session.visibilityChecker
val file = context.findClosest<FirFile>() ?: return
val file = context.containingFile ?: return
val containingDeclarations = context.containingDeclarations + containingClass
@OptIn(SymbolInternals::class)
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.analysis.checkers.isTopLevel
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.types.*
object FirTopLevelTypeAliasChecker : FirTypeAliasChecker() {
override fun check(declaration: FirTypeAlias, context: CheckerContext, reporter: DiagnosticReporter) {
if (context.containingDeclarations.lastOrNull() !is FirFile) {
if (!context.isTopLevel) {
reporter.reportOn(declaration.source, FirErrors.TOPLEVEL_TYPEALIASES_ONLY, context)
}
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirOperation
@@ -49,7 +48,7 @@ object FirEqualityCompatibilityChecker : FirEqualityOperatorCallChecker() {
throw IllegalStateException(
"Exception while determining type compatibility: lType: $lType, rType: $rType, " +
"equality ${expression.render()}, " +
"file ${context.containingDeclarations.filterIsInstance<FirFile>().firstOrNull()?.name}",
"file ${context.containingFile?.name}",
e
)
}