From 3fee87a0f32badb8580725a7b13f7d8b37730ef1 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Thu, 19 Aug 2021 12:18:34 +0300 Subject: [PATCH] [FIR] Add ENUM_JVM_RECORD diagnostic --- .../generator/diagnostics/FirJvmDiagnosticsList.kt | 1 + .../generator/diagnostics/model/RegularDiagnosticData.kt | 2 +- .../kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt | 1 + .../jvm/checkers/declaration/FirJvmRecordChecker.kt | 7 +++++++ .../analysis/diagnostics/LightTreePositioningStrategies.kt | 3 +++ .../diagnostics/SourceElementPositioningStrategies.kt | 5 +++++ .../jetbrains/kotlin/diagnostics/PositioningStrategies.kt | 3 +++ .../tests/testsWithJava15/jvmRecord/diagnostics.fir.kt | 2 +- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +++++++ 11 files changed, 39 insertions(+), 2 deletions(-) diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index dfebb25b2c5..30b365004ed 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -64,6 +64,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val RECORDS by object : DiagnosticGroup("JVM Records") { val LOCAL_JVM_RECORD by error() val NON_FINAL_JVM_RECORD by error(PositioningStrategy.NON_FINAL_MODIFIER_OR_NAME) + val ENUM_JVM_RECORD by error(PositioningStrategy.ENUM_MODIFIER) } } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt index 06d18b9c198..bca9f64a521 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt @@ -105,7 +105,7 @@ enum class PositioningStrategy(private val strategy: String? = null) { COMMAS, OPERATOR_MODIFIER, NON_FINAL_MODIFIER_OR_NAME, - + ENUM_MODIFIER, ; val expressionToCreate get() = "SourceElementPositioningStrategies.${strategy ?: name}" diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index 9fa28c299ed..d1e846161af 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -53,5 +53,6 @@ object FirJvmErrors { // JVM Records val LOCAL_JVM_RECORD by error0() val NON_FINAL_JVM_RECORD by error0(SourceElementPositioningStrategies.NON_FINAL_MODIFIER_OR_NAME) + val ENUM_JVM_RECORD by error0(SourceElementPositioningStrategies.ENUM_MODIFIER) } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmRecordChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmRecordChecker.kt index c6f7bc82594..b2f32920d71 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmRecordChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmRecordChecker.kt @@ -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.declarations.FirRegularClass 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.isLocal import org.jetbrains.kotlin.name.FqName @@ -30,6 +31,12 @@ object FirJvmRecordChecker : FirRegularClassChecker() { if (!declaration.isFinal) { reporter.reportOn(declaration.source, FirJvmErrors.NON_FINAL_JVM_RECORD, context) + return + } + + if (declaration.isEnumClass) { + reporter.reportOn(declaration.source, FirJvmErrors.ENUM_JVM_RECORD, context) + return } } } \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index 14d0b89e378..fe200d6b3ce 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -376,6 +376,9 @@ object LightTreePositioningStrategies { val OPERATOR_MODIFIER: LightTreePositioningStrategy = ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.OPERATOR_KEYWORD)) + val ENUM_MODIFIER: LightTreePositioningStrategy = + ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.ENUM_KEYWORD)) + val INLINE_PARAMETER_MODIFIER: LightTreePositioningStrategy = ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.NOINLINE_KEYWORD, KtTokens.CROSSINLINE_KEYWORD)) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt index 3c9597cc46a..f0f60913388 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt @@ -314,4 +314,9 @@ object SourceElementPositioningStrategies { LightTreePositioningStrategies.NON_FINAL_MODIFIER_OR_NAME, PositioningStrategies.NON_FINAL_MODIFIER_OR_NAME ) + + val ENUM_MODIFIER = SourceElementPositioningStrategy( + LightTreePositioningStrategies.ENUM_MODIFIER, + PositioningStrategies.ENUM_MODIFIER + ) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index 7e206de7822..3818c01edc6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -380,6 +380,9 @@ object PositioningStrategies { @JvmField val OPERATOR_MODIFIER: PositioningStrategy = modifierSetPosition(KtTokens.OPERATOR_KEYWORD) + @JvmField + val ENUM_MODIFIER: PositioningStrategy = modifierSetPosition(KtTokens.ENUM_KEYWORD) + @JvmField val FOR_REDECLARATION: PositioningStrategy = object : PositioningStrategy() { override fun mark(element: PsiElement): List { diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt index 4b78c26430d..a9beda4543f 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt @@ -34,7 +34,7 @@ class A5(vararg val name: String, y: Int) sealed class A8(val x: String) @JvmRecord -enum class A9(val x: String) { +enum class A9(val x: String) { X(""); } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 609fdfd67e3..330f9d6c794 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3550,4 +3550,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.ENUM_JVM_RECORD) { firDiagnostic -> + EnumJvmRecordImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index ab2791f2613..d383cb06182 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2473,4 +2473,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = NonFinalJvmRecord::class } + abstract class EnumJvmRecord : KtFirDiagnostic() { + override val diagnosticClass get() = EnumJvmRecord::class + } + } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 5fde2322be4..b0d2d74f42e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -4007,3 +4007,10 @@ internal class NonFinalJvmRecordImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class EnumJvmRecordImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.EnumJvmRecord(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} +