diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 6057fa9a4e8..4f611e1f2cc 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -878,6 +878,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val LATEINIT_PROPERTY_FIELD_DECLARATION_WITH_INITIALIZER by error(PositioningStrategy.LATEINIT_MODIFIER) val LATEINIT_FIELD_IN_VAL_PROPERTY by error(PositioningStrategy.LATEINIT_MODIFIER) val LATEINIT_NULLABLE_BACKING_FIELD by error(PositioningStrategy.LATEINIT_MODIFIER) + val BACKING_FIELD_FOR_DELEGATED_PROPERTY by error(PositioningStrategy.FIELD_KEYWORD) val PROPERTY_MUST_HAVE_GETTER by error() val PROPERTY_MUST_HAVE_SETTER by error() val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error(PositioningStrategy.FIELD_KEYWORD) diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 44b43259ed0..bda4e94b0ad 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -485,6 +485,7 @@ object FirErrors { val LATEINIT_PROPERTY_FIELD_DECLARATION_WITH_INITIALIZER by error0(SourceElementPositioningStrategies.LATEINIT_MODIFIER) val LATEINIT_FIELD_IN_VAL_PROPERTY by error0(SourceElementPositioningStrategies.LATEINIT_MODIFIER) val LATEINIT_NULLABLE_BACKING_FIELD by error0(SourceElementPositioningStrategies.LATEINIT_MODIFIER) + val BACKING_FIELD_FOR_DELEGATED_PROPERTY by error0(SourceElementPositioningStrategies.FIELD_KEYWORD) val PROPERTY_MUST_HAVE_GETTER by error0() val PROPERTY_MUST_HAVE_SETTER by error0() val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error0(SourceElementPositioningStrategies.FIELD_KEYWORD) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPropertyFieldDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPropertyFieldDeclarationChecker.kt index f07a2a4351a..5914331dc53 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPropertyFieldDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPropertyFieldDeclarationChecker.kt @@ -53,6 +53,10 @@ object FirPropertyFieldTypeChecker : FirPropertyChecker() { reporter.reportOn(backingField.source, FirErrors.LATEINIT_NULLABLE_BACKING_FIELD, context) } + if (declaration.delegate != null) { + reporter.reportOn(backingField.source, FirErrors.BACKING_FIELD_FOR_DELEGATED_PROPERTY, context) + } + if (backingField.returnTypeRef.coneType == declaration.returnTypeRef.coneType) { reporter.reportOn(backingField.source, FirErrors.REDUNDANT_EXPLICIT_BACKING_FIELD, context) return diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index d0518fdb852..c03841d4770 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -70,6 +70,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNING_SINGLE_ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNMENT_TYPE_MISMATCH import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGN_OPERATOR_AMBIGUITY +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BACKING_FIELD_FOR_DELEGATED_PROPERTY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BACKING_FIELD_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BOUNDS_NOT_ALLOWED_IF_BOUNDED_BY_TYPE_PARAMETER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BOUND_ON_TYPE_ALIAS_PARAMETER_NOT_ALLOWED @@ -1298,6 +1299,10 @@ class FirDefaultErrorMessages { LATEINIT_NULLABLE_BACKING_FIELD, "Lateinit modifier is not allowed on backing fields of a type with nullable upper bound" ) + map.put( + BACKING_FIELD_FOR_DELEGATED_PROPERTY, + "Delegated properties can't have explicit backing field declarations" + ) map.put( PROPERTY_MUST_HAVE_GETTER, "This property needs a custom getter, because it's type is not a supertype of the backing field's type" 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 3bb99d41798..45123e58e58 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 @@ -2436,6 +2436,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.BACKING_FIELD_FOR_DELEGATED_PROPERTY) { firDiagnostic -> + BackingFieldForDelegatedPropertyImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.PROPERTY_MUST_HAVE_GETTER) { firDiagnostic -> PropertyMustHaveGetterImpl( firDiagnostic as FirPsiDiagnostic, 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 d31d5fc2d59..83effb7fa7a 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 @@ -1723,6 +1723,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = LateinitNullableBackingField::class } + abstract class BackingFieldForDelegatedProperty : KtFirDiagnostic() { + override val diagnosticClass get() = BackingFieldForDelegatedProperty::class + } + abstract class PropertyMustHaveGetter : KtFirDiagnostic() { override val diagnosticClass get() = PropertyMustHaveGetter::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 b4d37736601..529b4a997c6 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 @@ -2774,6 +2774,13 @@ internal class LateinitNullableBackingFieldImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class BackingFieldForDelegatedPropertyImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.BackingFieldForDelegatedProperty(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class PropertyMustHaveGetterImpl( firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken,