FIR checker: Make FirJvmExternalDeclarationChecker a

FirMemberDeclarationChecker.

Set isExternal in status for FirRegularClass. Invoke member declaration
checkers for FirRegularClass.
This commit is contained in:
Mark Punzalan
2021-03-05 10:25:57 +00:00
committed by Ilya Kirillov
parent cef26a043e
commit 315047b164
6 changed files with 16 additions and 14 deletions
@@ -7,24 +7,20 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration.jvm
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext 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.checkers.declaration.FirModifierList
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.*
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.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
// TODO: Move this to different, JVM-specific module? // TODO: Move this to different, JVM-specific module?
object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() { object FirJvmExternalDeclarationChecker : FirMemberDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (!declaration.isExternal) return
val source = declaration.source ?: return val source = declaration.source ?: return
if (source.kind is FirFakeSourceElementKind) 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. // WRONG_MODIFIER_TARGET on external constructor is intentionally NOT covered in this checker.
if (declaration !is FirFunction<*>) { if (declaration !is FirFunction<*>) {
@@ -33,7 +29,11 @@ object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() {
is FirRegularClass -> "class" is FirRegularClass -> "class"
else -> "non-function declaration" 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): // TODO: Implement checkers for these JVM-specific errors (see ExternalFunChecker in FE1.0):
@@ -31,7 +31,7 @@ class DeclarationCheckersDiagnosticComponent(
} }
override fun visitRegularClass(regularClass: FirRegularClass, data: CheckerContext) { 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) { override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: CheckerContext) {
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.jvm.FirJvmExternal
// TODO: Move this to different, JVM-specific module? // TODO: Move this to different, JVM-specific module?
object JvmDeclarationCheckers : DeclarationCheckers() { object JvmDeclarationCheckers : DeclarationCheckers() {
override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker> = setOf( override val memberDeclarationCheckers: Set<FirMemberDeclarationChecker> = setOf(
FirJvmExternalDeclarationChecker, FirJvmExternalDeclarationChecker,
) )
} }
@@ -408,6 +408,7 @@ class DeclarationsConverter(
isData = modifiers.isDataClass() isData = modifiers.isDataClass()
isInline = modifiers.isInlineClass() isInline = modifiers.isInlineClass()
isFun = modifiers.isFunctionalInterface() isFun = modifiers.isFunctionalInterface()
isExternal = modifiers.hasExternal()
} }
buildRegularClass { buildRegularClass {
@@ -817,6 +817,7 @@ class RawFirBuilder(
isData = classOrObject.hasModifier(DATA_KEYWORD) isData = classOrObject.hasModifier(DATA_KEYWORD)
isInline = classOrObject.hasModifier(INLINE_KEYWORD) isInline = classOrObject.hasModifier(INLINE_KEYWORD)
isFun = classOrObject.hasModifier(FUN_KEYWORD) isFun = classOrObject.hasModifier(FUN_KEYWORD)
isExternal = classOrObject.hasModifier(EXTERNAL_KEYWORD)
} }
withCapturedTypeParameters { withCapturedTypeParameters {
if (!status.isInner) context.capturedTypeParameters = context.capturedTypeParameters.clear() if (!status.isInner) context.capturedTypeParameters = context.capturedTypeParameters.clear()
@@ -26,7 +26,7 @@ val allProhibited: (<!INCOMPATIBLE_MODIFIERS, REDUNDANT_MODIFIER!>abstract<!>
<!INCOMPATIBLE_MODIFIERS!>crossinline<!> <!INCOMPATIBLE_MODIFIERS!>crossinline<!>
<!INCOMPATIBLE_MODIFIERS!>data<!> <!INCOMPATIBLE_MODIFIERS!>data<!>
enum enum
<!WRONG_MODIFIER_TARGET!>external<!> external
<!INCOMPATIBLE_MODIFIERS!>final<!> <!INCOMPATIBLE_MODIFIERS!>final<!>
<!INCOMPATIBLE_MODIFIERS!>in<!> <!INCOMPATIBLE_MODIFIERS!>in<!>
<!INCOMPATIBLE_MODIFIERS!>inline<!> <!INCOMPATIBLE_MODIFIERS!>inline<!>