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 5d2231a817d..c7e4348b0bb 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 @@ -66,6 +66,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { 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() + val NON_DATA_CLASS_JVM_RECORD 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 a9f91ed5151..b5d7b888e38 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 @@ -55,5 +55,6 @@ object FirJvmErrors { 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() + val NON_DATA_CLASS_JVM_RECORD 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 698a5dcea8a..08f180a24a7 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,10 +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.fir.declarations.utils.primaryConstructor +import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.name.FqName object FirJvmRecordChecker : FirRegularClassChecker() { @@ -40,6 +37,11 @@ object FirJvmRecordChecker : FirRegularClassChecker() { return } + if (!declaration.isData) { + reporter.reportOn(annotationSource, FirJvmErrors.NON_DATA_CLASS_JVM_RECORD, context) + return + } + if (declaration.primaryConstructor?.valueParameters?.isEmpty() == true) { reporter.reportOn(annotationSource, FirJvmErrors.JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS, context) } diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt index 33f4feef441..dfee8665900 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/diagnostics.fir.kt @@ -4,24 +4,24 @@ // JVM_TARGET: 15 // ENABLE_JVM_PREVIEW -@JvmRecord +@JvmRecord class A0 -@JvmRecord +@JvmRecord class A1 { constructor() } -@JvmRecord +@JvmRecord class A2() -@JvmRecord +@JvmRecord class A3(name: String) -@JvmRecord +@JvmRecord class A4(var name: String) -@JvmRecord +@JvmRecord class A5(vararg val name: String, y: Int) @JvmRecord @@ -38,7 +38,7 @@ class A5(vararg val name: String, y: Int) X(""); } -@JvmRecord +@JvmRecord class A10( val x: String, val y: Int, @@ -51,6 +51,6 @@ fun main() { } class Outer { - @JvmRecord + @JvmRecord inner class Inner(val name: String) } diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/disabledFeature.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/disabledFeature.fir.kt index 2048c53037b..92c5964ead8 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/disabledFeature.fir.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/disabledFeature.fir.kt @@ -5,7 +5,7 @@ public record JRecord(int x, CharSequence y) {} // FILE: main.kt -@JvmRecord +@JvmRecord class MyRec( val x: String, val y: Int, diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.fir.kt index f2c687829c5..ee6d04a996e 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.fir.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.fir.kt @@ -3,12 +3,12 @@ // JVM_TARGET: 15 // ENABLE_JVM_PREVIEW -@JvmRecord +@JvmRecord class BasicRecord(val x: String) @JvmRecord data class BasicDataRecord(val x: String) -@JvmRecord +@JvmRecord class BasicRecordWithSuperClass(val x: String) : Record() 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 13b810d0493..265bd8c3045 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 @@ -3562,4 +3562,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.NON_DATA_CLASS_JVM_RECORD) { firDiagnostic -> + NonDataClassJvmRecordImpl( + 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 093d7531b3b..4c1583f3c2d 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 @@ -2481,4 +2481,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = JvmRecordWithoutPrimaryConstructorParameters::class } + abstract class NonDataClassJvmRecord : KtFirDiagnostic() { + override val diagnosticClass get() = NonDataClassJvmRecord::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 e96963f12c2..d1827552312 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 @@ -4021,3 +4021,10 @@ internal class JvmRecordWithoutPrimaryConstructorParametersImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class NonDataClassJvmRecordImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.NonDataClassJvmRecord(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} +