From f0dbe1ad2ddc21e2401b39e6727bff2ca6ad8529 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 9 Jan 2023 18:05:19 +0100 Subject: [PATCH] FIR checkers: reuse CheckerContext.containingFile & isTopLevel --- .../js/checkers/declaration/FirJsExternalFileChecker.kt | 5 +---- .../declaration/FirJsModuleOnVarPropertyChecker.kt | 9 ++------- .../declaration/FirJvmFieldApplicabilityChecker.kt | 4 +--- .../native/checkers/FirNativeSharedImmutableChecker.kt | 4 ++-- .../native/checkers/FirNativeThreadLocalChecker.kt | 3 ++- .../checkers/declaration/FirAnnotationChecker.kt | 3 +-- .../analysis/checkers/declaration/FirOverrideChecker.kt | 5 ++--- .../checkers/declaration/FirTopLevelTypeAliasChecker.kt | 4 ++-- .../expression/FirEqualityCompatibilityChecker.kt | 3 +-- 9 files changed, 14 insertions(+), 26 deletions(-) diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExternalFileChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExternalFileChecker.kt index 036a8daef97..ad860409960 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExternalFileChecker.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExternalFileChecker.kt @@ -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() + val targetAnnotations = context.containingFile ?.annotations ?.firstOrNull { it.fullyExpandedClassId(context.session) in JsStandardClassIds.Annotations.annotationsRequiringExternal } diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsModuleOnVarPropertyChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsModuleOnVarPropertyChecker.kt index f505c729c85..3f3f56f0f65 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsModuleOnVarPropertyChecker.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsModuleOnVarPropertyChecker.kt @@ -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() - - 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) } } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmFieldApplicabilityChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmFieldApplicabilityChecker.kt index 1730aadacf4..4d20eff7530 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmFieldApplicabilityChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmFieldApplicabilityChecker.kt @@ -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()?.annotations?.any { + return context.containingFile?.annotations?.any { it.annotationTypeRef.coneType.classId == JVM_MULTIFILE_CLASS_ID } == true } diff --git a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeSharedImmutableChecker.kt b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeSharedImmutableChecker.kt index d4b820370ae..03c801fe201 100644 --- a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeSharedImmutableChecker.kt +++ b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeSharedImmutableChecker.kt @@ -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, diff --git a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeThreadLocalChecker.kt b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeThreadLocalChecker.kt index a34b21d2477..aba98a29fbd 100644 --- a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeThreadLocalChecker.kt +++ b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeThreadLocalChecker.kt @@ -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) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationChecker.kt index b67cbf216d5..f6d3199ca28 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationChecker.kt @@ -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() + val closestFirFile = context.containingFile if (closestFirFile != null && !closestFirFile.packageFqName.startsWith(StandardClassIds.BASE_KOTLIN_PACKAGE.shortName())) { reporter.reportOn( deprecatedSinceKotlin.source, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index 42dec09c5fd..f7c09a3ca57 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -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() ?: 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() ?: return + val file = context.containingFile ?: return val containingDeclarations = context.containingDeclarations + containingClass @OptIn(SymbolInternals::class) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelTypeAliasChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelTypeAliasChecker.kt index 2a01a91f327..9abaebd6803 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelTypeAliasChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelTypeAliasChecker.kt @@ -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) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt index d342477f7df..4f430625712 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirEqualityCompatibilityChecker.kt @@ -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().firstOrNull()?.name}", + "file ${context.containingFile?.name}", e ) }