From 84f5d6b1491341214fadde0cf445a82f2ba7bb34 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Thu, 19 Aug 2021 12:37:26 +0300 Subject: [PATCH] [FIR] Add JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS diagnostic --- .../generator/diagnostics/FirJvmDiagnosticsList.kt | 1 + .../kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt | 1 + .../jvm/checkers/declaration/FirJvmRecordChecker.kt | 5 +++++ .../tests/testsWithJava15/jvmRecord/diagnostics.fir.kt | 4 ++-- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +++++++ 7 files changed, 26 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 30b365004ed..5d2231a817d 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 @@ -65,6 +65,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { 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) + val JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS by error() } } 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 d1e846161af..a9f91ed5151 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 @@ -54,5 +54,6 @@ object FirJvmErrors { 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) + val JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS by error0() } 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 b2f32920d71..698a5dcea8a 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 @@ -15,6 +15,7 @@ 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.fir.declarations.utils.primaryConstructor import org.jetbrains.kotlin.name.FqName object FirJvmRecordChecker : FirRegularClassChecker() { @@ -38,5 +39,9 @@ object FirJvmRecordChecker : FirRegularClassChecker() { reporter.reportOn(declaration.source, FirJvmErrors.ENUM_JVM_RECORD, context) return } + + if (declaration.primaryConstructor?.valueParameters?.isEmpty() == true) { + reporter.reportOn(annotationSource, FirJvmErrors.JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS, context) + } } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt index a9beda4543f..33f4feef441 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt @@ -4,7 +4,7 @@ // JVM_TARGET: 15 // ENABLE_JVM_PREVIEW -@JvmRecord +@JvmRecord class A0 @JvmRecord @@ -12,7 +12,7 @@ class A1 { constructor() } -@JvmRecord +@JvmRecord class A2() @JvmRecord 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 330f9d6c794..13b810d0493 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 @@ -3556,4 +3556,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS) { firDiagnostic -> + JvmRecordWithoutPrimaryConstructorParametersImpl( + 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 d383cb06182..093d7531b3b 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 @@ -2477,4 +2477,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = EnumJvmRecord::class } + abstract class JvmRecordWithoutPrimaryConstructorParameters : KtFirDiagnostic() { + override val diagnosticClass get() = JvmRecordWithoutPrimaryConstructorParameters::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 b0d2d74f42e..e96963f12c2 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 @@ -4014,3 +4014,10 @@ internal class EnumJvmRecordImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class JvmRecordWithoutPrimaryConstructorParametersImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.JvmRecordWithoutPrimaryConstructorParameters(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} +