From bf845b6066024b876bb25ca5de437c100bd67701 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Thu, 19 Aug 2021 13:27:38 +0300 Subject: [PATCH] [FIR] Add JVM_RECORD_NOT_VAL_PARAMETER diagnostic --- .../generator/diagnostics/FirJvmDiagnosticsList.kt | 1 + .../fir/analysis/diagnostics/jvm/FirJvmErrors.kt | 1 + .../jvm/checkers/declaration/FirJvmRecordChecker.kt | 11 +++++++++++ .../jvmRecord/jvmRecordDescriptorStructure.fir.kt | 3 +++ .../jvmRecord/jvmRecordDescriptorStructure.kt | 3 +++ .../api/fir/diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../frontend/api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +++++++ 8 files changed, 36 insertions(+) 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 c7e4348b0bb..ff45c6a369e 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 @@ -67,6 +67,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { 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() + val JVM_RECORD_NOT_VAL_PARAMETER 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 b5d7b888e38..d43c68b5e6d 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 @@ -56,5 +56,6 @@ object FirJvmErrors { 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() + val JVM_RECORD_NOT_VAL_PARAMETER 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 4dd1eb16d9a..1fb7cdbdf73 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 @@ -6,12 +6,14 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirRegularClassChecker import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.getAnnotationByFqName import org.jetbrains.kotlin.fir.declarations.utils.* @@ -58,6 +60,15 @@ object FirJvmRecordChecker : FirRegularClassChecker() { if (declaration.primaryConstructor?.valueParameters?.isEmpty() == true) { reporter.reportOn(annotationSource, FirJvmErrors.JVM_RECORD_WITHOUT_PRIMARY_CONSTRUCTOR_PARAMETERS, context) + return + } + + declaration.declarations.forEach { decl -> + if (decl is FirProperty) { + if (decl.isVar && decl.source?.kind == FirFakeSourceElementKind.PropertyFromParameter) { + reporter.reportOn(decl.source, FirJvmErrors.JVM_RECORD_NOT_VAL_PARAMETER, context) + } + } } } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.fir.kt index ee6d04a996e..d30315c8d2a 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.fir.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.fir.kt @@ -9,6 +9,9 @@ class BasicRecord(val x: String) @JvmRecord data class BasicDataRecord(val x: String) +@JvmRecord +data class VarInConstructor(var x: String) + @JvmRecord class BasicRecordWithSuperClass(val x: String) : Record() diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.kt index e5bf69480a8..f54099ef474 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/jvmRecordDescriptorStructure.kt @@ -9,6 +9,9 @@ class BasicRecord(val x: String) @JvmRecord data class BasicDataRecord(val x: String) +@JvmRecord +data class VarInConstructor(var x: String) + @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 265bd8c3045..d55009992d6 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 @@ -3568,4 +3568,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.JVM_RECORD_NOT_VAL_PARAMETER) { firDiagnostic -> + JvmRecordNotValParameterImpl( + 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 4c1583f3c2d..12b6a74eae1 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 @@ -2485,4 +2485,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = NonDataClassJvmRecord::class } + abstract class JvmRecordNotValParameter : KtFirDiagnostic() { + override val diagnosticClass get() = JvmRecordNotValParameter::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 d1827552312..0d580718029 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 @@ -4028,3 +4028,10 @@ internal class NonDataClassJvmRecordImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class JvmRecordNotValParameterImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.JvmRecordNotValParameter(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} +