[FIR] Forbid backing fields for delegated properties
This commit is contained in:
committed by
TeamCityServer
parent
e4473ad94c
commit
4e56ba2fa4
+1
@@ -878,6 +878,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
val LATEINIT_PROPERTY_FIELD_DECLARATION_WITH_INITIALIZER by error<KtBackingField>(PositioningStrategy.LATEINIT_MODIFIER)
|
||||
val LATEINIT_FIELD_IN_VAL_PROPERTY by error<KtBackingField>(PositioningStrategy.LATEINIT_MODIFIER)
|
||||
val LATEINIT_NULLABLE_BACKING_FIELD by error<KtBackingField>(PositioningStrategy.LATEINIT_MODIFIER)
|
||||
val BACKING_FIELD_FOR_DELEGATED_PROPERTY by error<KtBackingField>(PositioningStrategy.FIELD_KEYWORD)
|
||||
val PROPERTY_MUST_HAVE_GETTER by error<KtProperty>()
|
||||
val PROPERTY_MUST_HAVE_SETTER by error<KtProperty>()
|
||||
val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error<KtBackingField>(PositioningStrategy.FIELD_KEYWORD)
|
||||
|
||||
@@ -485,6 +485,7 @@ object FirErrors {
|
||||
val LATEINIT_PROPERTY_FIELD_DECLARATION_WITH_INITIALIZER by error0<KtBackingField>(SourceElementPositioningStrategies.LATEINIT_MODIFIER)
|
||||
val LATEINIT_FIELD_IN_VAL_PROPERTY by error0<KtBackingField>(SourceElementPositioningStrategies.LATEINIT_MODIFIER)
|
||||
val LATEINIT_NULLABLE_BACKING_FIELD by error0<KtBackingField>(SourceElementPositioningStrategies.LATEINIT_MODIFIER)
|
||||
val BACKING_FIELD_FOR_DELEGATED_PROPERTY by error0<KtBackingField>(SourceElementPositioningStrategies.FIELD_KEYWORD)
|
||||
val PROPERTY_MUST_HAVE_GETTER by error0<KtProperty>()
|
||||
val PROPERTY_MUST_HAVE_SETTER by error0<KtProperty>()
|
||||
val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error0<KtBackingField>(SourceElementPositioningStrategies.FIELD_KEYWORD)
|
||||
|
||||
+4
@@ -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
|
||||
|
||||
+5
@@ -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"
|
||||
|
||||
+6
@@ -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,
|
||||
|
||||
+4
@@ -1723,6 +1723,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
override val diagnosticClass get() = LateinitNullableBackingField::class
|
||||
}
|
||||
|
||||
abstract class BackingFieldForDelegatedProperty : KtFirDiagnostic<KtBackingField>() {
|
||||
override val diagnosticClass get() = BackingFieldForDelegatedProperty::class
|
||||
}
|
||||
|
||||
abstract class PropertyMustHaveGetter : KtFirDiagnostic<KtProperty>() {
|
||||
override val diagnosticClass get() = PropertyMustHaveGetter::class
|
||||
}
|
||||
|
||||
+7
@@ -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<KtBackingField> {
|
||||
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class PropertyMustHaveGetterImpl(
|
||||
firDiagnostic: FirPsiDiagnostic,
|
||||
override val token: ValidityToken,
|
||||
|
||||
Reference in New Issue
Block a user