From 315047b1647a8066e7c80b05cfae30e69920814e Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Fri, 5 Mar 2021 10:25:57 +0000 Subject: [PATCH] FIR checker: Make FirJvmExternalDeclarationChecker a FirMemberDeclarationChecker. Set isExternal in status for FirRegularClass. Invoke member declaration checkers for FirRegularClass. --- .../jvm/FirJvmExternalDeclarationChecker.kt | 22 +++++++++---------- .../DeclarationCheckersDiagnosticComponent.kt | 2 +- .../fir/checkers/JvmDeclarationCheckers.kt | 2 +- .../converter/DeclarationsConverter.kt | 1 + .../kotlin/fir/builder/RawFirBuilder.kt | 1 + .../modifierOnParameterInFunctionType.fir.kt | 2 +- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/jvm/FirJvmExternalDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/jvm/FirJvmExternalDeclarationChecker.kt index c607978a148..62e107f16dc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/jvm/FirJvmExternalDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/jvm/FirJvmExternalDeclarationChecker.kt @@ -7,24 +7,20 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration.jvm import org.jetbrains.kotlin.fir.FirFakeSourceElementKind 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.declaration.FirMemberDeclarationChecker import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirModifierList import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirFunction -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.lexer.KtTokens // TODO: Move this to different, JVM-specific module? -object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() { - override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { +object FirJvmExternalDeclarationChecker : FirMemberDeclarationChecker() { + override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + if (!declaration.isExternal) return val source = declaration.source ?: return if (source.kind is FirFakeSourceElementKind) return - val modifierList = with(FirModifierList) { source.getModifierList() } - val externalModifier = modifierList?.modifiers?.firstOrNull { it.token == KtTokens.EXTERNAL_KEYWORD } ?: return // WRONG_MODIFIER_TARGET on external constructor is intentionally NOT covered in this checker. if (declaration !is FirFunction<*>) { @@ -33,7 +29,11 @@ object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() { is FirRegularClass -> "class" else -> "non-function declaration" } - reporter.reportOn(externalModifier.source, FirErrors.WRONG_MODIFIER_TARGET, externalModifier.token, target, context) + val modifierList = with(FirModifierList) { source.getModifierList() } + val externalModifier = modifierList?.modifiers?.firstOrNull { it.token == KtTokens.EXTERNAL_KEYWORD } + externalModifier?.let { + reporter.reportOn(it.source, FirErrors.WRONG_MODIFIER_TARGET, it.token, target, context) + } } // TODO: Implement checkers for these JVM-specific errors (see ExternalFunChecker in FE1.0): @@ -42,4 +42,4 @@ object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() { // - EXTERNAL_DECLARATION_CANNOT_HAVE_BODY // - EXTERNAL_DECLARATION_CANNOT_BE_INLINED } -} \ No newline at end of file +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt index 0f81cec82c0..9890349d53b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/DeclarationCheckersDiagnosticComponent.kt @@ -31,7 +31,7 @@ class DeclarationCheckersDiagnosticComponent( } override fun visitRegularClass(regularClass: FirRegularClass, data: CheckerContext) { - checkers.regularClassCheckers.check(regularClass, data, reporter) + (checkers.memberDeclarationCheckers + checkers.regularClassCheckers).check(regularClass, data, reporter) } override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: CheckerContext) { diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/JvmDeclarationCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/JvmDeclarationCheckers.kt index 40a5672d840..800d15f6f49 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/JvmDeclarationCheckers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/JvmDeclarationCheckers.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.jvm.FirJvmExternal // TODO: Move this to different, JVM-specific module? object JvmDeclarationCheckers : DeclarationCheckers() { - override val basicDeclarationCheckers: Set = setOf( + override val memberDeclarationCheckers: Set = setOf( FirJvmExternalDeclarationChecker, ) } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 2f3241cd880..74899c371ba 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -408,6 +408,7 @@ class DeclarationsConverter( isData = modifiers.isDataClass() isInline = modifiers.isInlineClass() isFun = modifiers.isFunctionalInterface() + isExternal = modifiers.hasExternal() } buildRegularClass { diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index f2cce52e12f..8247429f284 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -817,6 +817,7 @@ class RawFirBuilder( isData = classOrObject.hasModifier(DATA_KEYWORD) isInline = classOrObject.hasModifier(INLINE_KEYWORD) isFun = classOrObject.hasModifier(FUN_KEYWORD) + isExternal = classOrObject.hasModifier(EXTERNAL_KEYWORD) } withCapturedTypeParameters { if (!status.isInner) context.capturedTypeParameters = context.capturedTypeParameters.clear() diff --git a/compiler/testData/diagnostics/tests/modifiers/modifierOnParameterInFunctionType.fir.kt b/compiler/testData/diagnostics/tests/modifiers/modifierOnParameterInFunctionType.fir.kt index 968af99d3e0..158233f2142 100644 --- a/compiler/testData/diagnostics/tests/modifiers/modifierOnParameterInFunctionType.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/modifierOnParameterInFunctionType.fir.kt @@ -26,7 +26,7 @@ val allProhibited: (abstract crossinline data enum - external + external final in inline