[FIR] Add ENUM_JVM_RECORD diagnostic

This commit is contained in:
Andrey Zinovyev
2021-08-19 12:18:34 +03:00
committed by Space
parent c8381e9b0f
commit 3fee87a0f3
11 changed files with 39 additions and 2 deletions
@@ -64,6 +64,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
val RECORDS by object : DiagnosticGroup("JVM Records") { val RECORDS by object : DiagnosticGroup("JVM Records") {
val LOCAL_JVM_RECORD by error<PsiElement>() val LOCAL_JVM_RECORD by error<PsiElement>()
val NON_FINAL_JVM_RECORD by error<PsiElement>(PositioningStrategy.NON_FINAL_MODIFIER_OR_NAME) val NON_FINAL_JVM_RECORD by error<PsiElement>(PositioningStrategy.NON_FINAL_MODIFIER_OR_NAME)
val ENUM_JVM_RECORD by error<PsiElement>(PositioningStrategy.ENUM_MODIFIER)
} }
} }
@@ -105,7 +105,7 @@ enum class PositioningStrategy(private val strategy: String? = null) {
COMMAS, COMMAS,
OPERATOR_MODIFIER, OPERATOR_MODIFIER,
NON_FINAL_MODIFIER_OR_NAME, NON_FINAL_MODIFIER_OR_NAME,
ENUM_MODIFIER,
; ;
val expressionToCreate get() = "SourceElementPositioningStrategies.${strategy ?: name}" val expressionToCreate get() = "SourceElementPositioningStrategies.${strategy ?: name}"
@@ -53,5 +53,6 @@ object FirJvmErrors {
// JVM Records // JVM Records
val LOCAL_JVM_RECORD by error0<PsiElement>() val LOCAL_JVM_RECORD by error0<PsiElement>()
val NON_FINAL_JVM_RECORD by error0<PsiElement>(SourceElementPositioningStrategies.NON_FINAL_MODIFIER_OR_NAME) val NON_FINAL_JVM_RECORD by error0<PsiElement>(SourceElementPositioningStrategies.NON_FINAL_MODIFIER_OR_NAME)
val ENUM_JVM_RECORD by error0<PsiElement>(SourceElementPositioningStrategies.ENUM_MODIFIER)
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
import org.jetbrains.kotlin.fir.declarations.utils.isFinal import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -30,6 +31,12 @@ object FirJvmRecordChecker : FirRegularClassChecker() {
if (!declaration.isFinal) { if (!declaration.isFinal) {
reporter.reportOn(declaration.source, FirJvmErrors.NON_FINAL_JVM_RECORD, context) reporter.reportOn(declaration.source, FirJvmErrors.NON_FINAL_JVM_RECORD, context)
return
}
if (declaration.isEnumClass) {
reporter.reportOn(declaration.source, FirJvmErrors.ENUM_JVM_RECORD, context)
return
} }
} }
} }
@@ -376,6 +376,9 @@ object LightTreePositioningStrategies {
val OPERATOR_MODIFIER: LightTreePositioningStrategy = val OPERATOR_MODIFIER: LightTreePositioningStrategy =
ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.OPERATOR_KEYWORD)) ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.OPERATOR_KEYWORD))
val ENUM_MODIFIER: LightTreePositioningStrategy =
ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.ENUM_KEYWORD))
val INLINE_PARAMETER_MODIFIER: LightTreePositioningStrategy = val INLINE_PARAMETER_MODIFIER: LightTreePositioningStrategy =
ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.NOINLINE_KEYWORD, KtTokens.CROSSINLINE_KEYWORD)) ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.NOINLINE_KEYWORD, KtTokens.CROSSINLINE_KEYWORD))
@@ -314,4 +314,9 @@ object SourceElementPositioningStrategies {
LightTreePositioningStrategies.NON_FINAL_MODIFIER_OR_NAME, LightTreePositioningStrategies.NON_FINAL_MODIFIER_OR_NAME,
PositioningStrategies.NON_FINAL_MODIFIER_OR_NAME PositioningStrategies.NON_FINAL_MODIFIER_OR_NAME
) )
val ENUM_MODIFIER = SourceElementPositioningStrategy(
LightTreePositioningStrategies.ENUM_MODIFIER,
PositioningStrategies.ENUM_MODIFIER
)
} }
@@ -380,6 +380,9 @@ object PositioningStrategies {
@JvmField @JvmField
val OPERATOR_MODIFIER: PositioningStrategy<KtModifierListOwner> = modifierSetPosition(KtTokens.OPERATOR_KEYWORD) val OPERATOR_MODIFIER: PositioningStrategy<KtModifierListOwner> = modifierSetPosition(KtTokens.OPERATOR_KEYWORD)
@JvmField
val ENUM_MODIFIER: PositioningStrategy<KtModifierListOwner> = modifierSetPosition(KtTokens.ENUM_KEYWORD)
@JvmField @JvmField
val FOR_REDECLARATION: PositioningStrategy<PsiElement> = object : PositioningStrategy<PsiElement>() { val FOR_REDECLARATION: PositioningStrategy<PsiElement> = object : PositioningStrategy<PsiElement>() {
override fun mark(element: PsiElement): List<TextRange> { override fun mark(element: PsiElement): List<TextRange> {
@@ -34,7 +34,7 @@ class A5(vararg val name: String, y: Int)
<!NON_FINAL_JVM_RECORD!>sealed<!> class A8(val x: String) <!NON_FINAL_JVM_RECORD!>sealed<!> class A8(val x: String)
@JvmRecord @JvmRecord
enum class A9(val x: String) { <!ENUM_JVM_RECORD!>enum<!> class A9(val x: String) {
X(""); X("");
} }
@@ -3550,4 +3550,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token, token,
) )
} }
add(FirJvmErrors.ENUM_JVM_RECORD) { firDiagnostic ->
EnumJvmRecordImpl(
firDiagnostic as FirPsiDiagnostic,
token,
)
}
} }
@@ -2473,4 +2473,8 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = NonFinalJvmRecord::class override val diagnosticClass get() = NonFinalJvmRecord::class
} }
abstract class EnumJvmRecord : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = EnumJvmRecord::class
}
} }
@@ -4007,3 +4007,10 @@ internal class NonFinalJvmRecordImpl(
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
} }
internal class EnumJvmRecordImpl(
firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.EnumJvmRecord(), KtAbstractFirDiagnostic<PsiElement> {
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
}