FIR checker: Make FirJvmExternalDeclarationChecker a
FirMemberDeclarationChecker. Set isExternal in status for FirRegularClass. Invoke member declaration checkers for FirRegularClass.
This commit is contained in:
committed by
Ilya Kirillov
parent
cef26a043e
commit
315047b164
+11
-11
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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<FirBasicDeclarationChecker> = setOf(
|
||||
override val memberDeclarationCheckers: Set<FirMemberDeclarationChecker> = setOf(
|
||||
FirJvmExternalDeclarationChecker,
|
||||
)
|
||||
}
|
||||
|
||||
+1
@@ -408,6 +408,7 @@ class DeclarationsConverter(
|
||||
isData = modifiers.isDataClass()
|
||||
isInline = modifiers.isInlineClass()
|
||||
isFun = modifiers.isFunctionalInterface()
|
||||
isExternal = modifiers.hasExternal()
|
||||
}
|
||||
|
||||
buildRegularClass {
|
||||
|
||||
@@ -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()
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ val allProhibited: (<!INCOMPATIBLE_MODIFIERS, REDUNDANT_MODIFIER!>abstract<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>crossinline<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>data<!>
|
||||
enum
|
||||
<!WRONG_MODIFIER_TARGET!>external<!>
|
||||
external
|
||||
<!INCOMPATIBLE_MODIFIERS!>final<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>inline<!>
|
||||
|
||||
Reference in New Issue
Block a user