From 3314c8faaca0b95250dd6dc495ce11659e00751d Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Thu, 19 Aug 2021 15:27:56 +0300 Subject: [PATCH] [FIR] Add FIELD_IN_JVM_RECORD diagnostic --- .../generator/diagnostics/FirJvmDiagnosticsList.kt | 1 + .../kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt | 1 + .../jvm/checkers/declaration/FirJvmRecordChecker.kt | 5 ++++- .../testsWithJava15/jvmRecord/irrelevantFields.fir.kt | 8 ++++---- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +++++++ 7 files changed, 27 insertions(+), 5 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 7d82d17fabc..34e2dd296f1 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 @@ -70,6 +70,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val JVM_RECORD_NOT_VAL_PARAMETER by error() val JVM_RECORD_NOT_LAST_VARARG_PARAMETER by error() val INNER_JVM_RECORD by error(PositioningStrategy.INNER_MODIFIER) + val FIELD_IN_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 65cfea016b4..1aab921b8e3 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 @@ -59,5 +59,6 @@ object FirJvmErrors { val JVM_RECORD_NOT_VAL_PARAMETER by error0() val JVM_RECORD_NOT_LAST_VARARG_PARAMETER by error0() val INNER_JVM_RECORD by error0(SourceElementPositioningStrategies.INNER_MODIFIER) + val FIELD_IN_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 1d9aac2de1a..3720efb201e 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 @@ -77,8 +77,11 @@ object FirJvmRecordChecker : FirRegularClassChecker() { declaration.declarations.forEach { decl -> if (decl is FirProperty) { - if (decl.isVar && decl.source?.kind == FirFakeSourceElementKind.PropertyFromParameter) { + val fromConstructor = decl.source?.kind == FirFakeSourceElementKind.PropertyFromParameter + if (decl.isVar && fromConstructor) { reporter.reportOn(decl.source, FirJvmErrors.JVM_RECORD_NOT_VAL_PARAMETER, context) + } else if (!fromConstructor && (decl.hasBackingField || decl.delegateFieldSymbol != null)) { + reporter.reportOn(decl.source, FirJvmErrors.FIELD_IN_JVM_RECORD, context) } } } diff --git a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/irrelevantFields.fir.kt b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/irrelevantFields.fir.kt index 22af17371a7..8ec007be499 100644 --- a/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/irrelevantFields.fir.kt +++ b/compiler/testData/diagnostics/tests/testsWithJava15/jvmRecord/irrelevantFields.fir.kt @@ -13,13 +13,13 @@ data class MyRec1(val name: String) : I by i @JvmRecord data class MyRec2(val name: String) { - val x: Int = 0 + val x: Int = 0 } @JvmRecord data class MyRec3(val name: String) { - val y: String - get() = field + "1" + val y: String + get() = field + "1" init { y = "" @@ -28,7 +28,7 @@ data class MyRec3(val name: String) { @JvmRecord data class MyRec4(val name: String) { - val z: Int by lazy { 1 } + val z: Int by lazy { 1 } } @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 35efa2e50eb..ebf89ad7362 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 @@ -3586,4 +3586,10 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.FIELD_IN_JVM_RECORD) { firDiagnostic -> + FieldInJvmRecordImpl( + 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 2571fb3b052..b7b525fb084 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 @@ -2497,4 +2497,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = InnerJvmRecord::class } + abstract class FieldInJvmRecord : KtFirDiagnostic() { + override val diagnosticClass get() = FieldInJvmRecord::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 225805d0f34..2e60649e408 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 @@ -4049,3 +4049,10 @@ internal class InnerJvmRecordImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class FieldInJvmRecordImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.FieldInJvmRecord(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} +