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.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):
|
||||||
@@ -42,4 +42,4 @@ object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() {
|
|||||||
// - EXTERNAL_DECLARATION_CANNOT_HAVE_BODY
|
// - EXTERNAL_DECLARATION_CANNOT_HAVE_BODY
|
||||||
// - EXTERNAL_DECLARATION_CANNOT_BE_INLINED
|
// - EXTERNAL_DECLARATION_CANNOT_BE_INLINED
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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) {
|
||||||
|
|||||||
+1
-1
@@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -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()
|
||||||
|
|||||||
+1
-1
@@ -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<!>
|
||||||
|
|||||||
Reference in New Issue
Block a user