From 3a3ef161d1b27853cd17b80b9b9e89e0b211ba96 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Tue, 7 Sep 2021 20:52:07 +0300 Subject: [PATCH] [FIR] Add a REDUNDANT_EXPLICIT_BACKING_FIELD warning --- .../checkers/generator/diagnostics/FirDiagnosticsList.kt | 1 + .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 1 + .../declaration/FirPropertyFieldDeclarationChecker.kt | 8 +++++++- .../fir/analysis/diagnostics/FirDefaultErrorMessages.kt | 5 +++++ .../api/fir/diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +++++++ 7 files changed, 31 insertions(+), 1 deletion(-) 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 6767a11dc93..ec3b60f53e1 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 @@ -880,6 +880,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error(PositioningStrategy.FIELD_KEYWORD) val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error(PositioningStrategy.FIELD_KEYWORD) val EXPLICIT_BACKING_FIELD_IN_EXTENSION by error(PositioningStrategy.FIELD_KEYWORD) + val REDUNDANT_EXPLICIT_BACKING_FIELD by warning(PositioningStrategy.FIELD_KEYWORD) val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error(PositioningStrategy.ABSTRACT_MODIFIER) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning(PositioningStrategy.TYPE_PARAMETERS_LIST) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error(PositioningStrategy.TYPE_PARAMETERS_LIST) 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 7549b14c560..19e15220786 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 @@ -487,6 +487,7 @@ object FirErrors { val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error0(SourceElementPositioningStrategies.FIELD_KEYWORD) val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error0(SourceElementPositioningStrategies.FIELD_KEYWORD) val EXPLICIT_BACKING_FIELD_IN_EXTENSION by error0(SourceElementPositioningStrategies.FIELD_KEYWORD) + val REDUNDANT_EXPLICIT_BACKING_FIELD by warning0(SourceElementPositioningStrategies.FIELD_KEYWORD) val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error0(SourceElementPositioningStrategies.ABSTRACT_MODIFIER) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning0(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error0(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) 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 fa9cb915ddd..1c231c569bd 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 @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField import org.jetbrains.kotlin.fir.expressions.FirErrorExpression import org.jetbrains.kotlin.fir.typeContext +import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.isSubtypeOf object FirPropertyFieldTypeChecker : FirPropertyChecker() { @@ -25,7 +26,7 @@ object FirPropertyFieldTypeChecker : FirPropertyChecker() { return } - val typeCheckerContext = context.session.typeContext.newBaseTypeCheckerContext( + val typeCheckerContext = context.session.typeContext.newTypeCheckerState( errorTypesEqualToAnything = false, stubTypesEqualToAnything = false ) @@ -38,6 +39,11 @@ object FirPropertyFieldTypeChecker : FirPropertyChecker() { reporter.reportOn(backingField.source, FirErrors.PROPERTY_FIELD_DECLARATION_MISSING_INITIALIZER, context) } + if (backingField.returnTypeRef.coneType == declaration.returnTypeRef.coneType) { + reporter.reportOn(backingField.source, FirErrors.REDUNDANT_EXPLICIT_BACKING_FIELD, context) + return + } + if (!backingField.isSubtypeOf(declaration, typeCheckerContext)) { checkAsFieldNotSubtype(declaration, context, reporter) } 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 c49eda0069b..94f6da17c06 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 @@ -357,6 +357,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RECURSIVE_TYPEALI import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_ANNOTATION_TARGET import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_CALL_OF_CONVERSION_METHOD +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_EXPLICIT_BACKING_FIELD import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_EXPLICIT_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_MODALITY_MODIFIER @@ -1302,6 +1303,10 @@ class FirDefaultErrorMessages { EXPLICIT_BACKING_FIELD_IN_EXTENSION, "Extension properties cannot have a backing field" ) + map.put( + REDUNDANT_EXPLICIT_BACKING_FIELD, + "There's no need in an explicit backing field declaration if it has the same type as the property" + ) map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "This property cannot be declared abstract") map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING, "Type parameters for local variables are deprecated") map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS, "Local variables are not allowed to have type parameters") 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 09f1fcd51a1..9ba84adfe46 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 @@ -2448,6 +2448,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.REDUNDANT_EXPLICIT_BACKING_FIELD) { firDiagnostic -> + RedundantExplicitBackingFieldImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS) { firDiagnostic -> AbstractPropertyInPrimaryConstructorParametersImpl( 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 0aafa9b8db7..bcab44a501a 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 @@ -1731,6 +1731,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = ExplicitBackingFieldInExtension::class } + abstract class RedundantExplicitBackingField : KtFirDiagnostic() { + override val diagnosticClass get() = RedundantExplicitBackingField::class + } + abstract class AbstractPropertyInPrimaryConstructorParameters : KtFirDiagnostic() { override val diagnosticClass get() = AbstractPropertyInPrimaryConstructorParameters::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 b741bb200ae..5c3edb5847c 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 @@ -2825,6 +2825,13 @@ internal class ExplicitBackingFieldInExtensionImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class RedundantExplicitBackingFieldImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.RedundantExplicitBackingField(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class AbstractPropertyInPrimaryConstructorParametersImpl( firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken,