[FIR] Forbid explicit backing fields in extension properties

This commit is contained in:
Nikolay Lunyak
2021-08-23 12:46:44 +03:00
committed by TeamCityServer
parent d5ddd3cee3
commit 2aafe84eef
8 changed files with 32 additions and 5 deletions
@@ -879,6 +879,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val PROPERTY_MUST_HAVE_SETTER by error<KtProperty>() val PROPERTY_MUST_HAVE_SETTER by error<KtProperty>()
val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error<KtBackingField>() val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error<KtBackingField>()
val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error<KtBackingField>() val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error<KtBackingField>()
val EXPLICIT_BACKING_FIELD_IN_EXTENSION by error<KtBackingField>()
val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error<KtModifierListOwner>(PositioningStrategy.ABSTRACT_MODIFIER) val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error<KtModifierListOwner>(PositioningStrategy.ABSTRACT_MODIFIER)
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST)
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST)
@@ -486,6 +486,7 @@ object FirErrors {
val PROPERTY_MUST_HAVE_SETTER by error0<KtProperty>() val PROPERTY_MUST_HAVE_SETTER by error0<KtProperty>()
val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error0<KtBackingField>() val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error0<KtBackingField>()
val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error0<KtBackingField>() val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error0<KtBackingField>()
val EXPLICIT_BACKING_FIELD_IN_EXTENSION by error0<KtBackingField>()
val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error0<KtModifierListOwner>(SourceElementPositioningStrategies.ABSTRACT_MODIFIER) val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error0<KtModifierListOwner>(SourceElementPositioningStrategies.ABSTRACT_MODIFIER)
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
@@ -62,7 +62,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
override val backingFieldCheckers: Set<FirBackingFieldChecker> override val backingFieldCheckers: Set<FirBackingFieldChecker>
get() = setOf( get() = setOf(
FirExplicitBackingFieldInInterfaceChecker, FirExplicitBackingFieldForbiddenChecker,
) )
override val classCheckers: Set<FirClassChecker> override val classCheckers: Set<FirClassChecker>
@@ -17,8 +17,9 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
import org.jetbrains.kotlin.fir.declarations.utils.isAbstract import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.isExtension
object FirExplicitBackingFieldInInterfaceChecker : FirBackingFieldChecker() { object FirExplicitBackingFieldForbiddenChecker : FirBackingFieldChecker() {
override fun check(declaration: FirBackingField, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirBackingField, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration is FirDefaultPropertyBackingField) { if (declaration is FirDefaultPropertyBackingField) {
return return
@@ -34,10 +35,12 @@ object FirExplicitBackingFieldInInterfaceChecker : FirBackingFieldChecker() {
return return
} }
val diagnostic = getProperDiagnostic(context)
if (declaration.propertySymbol.isAbstract) { if (declaration.propertySymbol.isAbstract) {
reporter.reportOn(declaration.source, diagnostic, context) reporter.reportOn(declaration.source, getProperDiagnostic(context), context)
}
if (declaration.propertySymbol.isExtension) {
reporter.reportOn(declaration.source, FirErrors.EXPLICIT_BACKING_FIELD_IN_EXTENSION, context)
} }
} }
@@ -173,6 +173,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OPT_IN_MARKER_CAN
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OPT_IN_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OPT_IN_OVERRIDE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OPT_IN_OVERRIDE_ERROR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OPT_IN_OVERRIDE_ERROR
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_BACKING_FIELD_IN_EXTENSION
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_BACKING_FIELD_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_BACKING_FIELD_IN_INTERFACE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_DELEGATION_CALL_REQUIRED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPLICIT_DELEGATION_CALL_REQUIRED
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_FUNCTION_RETURN_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_FUNCTION_RETURN_TYPE
@@ -1297,6 +1298,10 @@ class FirDefaultErrorMessages {
EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY, EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY,
"Abstract property cannot have a backing field" "Abstract property cannot have a backing field"
) )
map.put(
EXPLICIT_BACKING_FIELD_IN_EXTENSION,
"Extension properties cannot have a backing field"
)
map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "This property cannot be declared abstract") 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_WARNING, "Type parameters for local variables are deprecated")
map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS, "Local variables are not allowed to have type parameters") map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS, "Local variables are not allowed to have type parameters")
@@ -2442,6 +2442,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token, token,
) )
} }
add(FirErrors.EXPLICIT_BACKING_FIELD_IN_EXTENSION) { firDiagnostic ->
ExplicitBackingFieldInExtensionImpl(
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS) { firDiagnostic -> add(FirErrors.ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS) { firDiagnostic ->
AbstractPropertyInPrimaryConstructorParametersImpl( AbstractPropertyInPrimaryConstructorParametersImpl(
firDiagnostic as FirPsiDiagnostic, firDiagnostic as FirPsiDiagnostic,
@@ -1727,6 +1727,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = ExplicitBackingFieldInAbstractProperty::class override val diagnosticClass get() = ExplicitBackingFieldInAbstractProperty::class
} }
abstract class ExplicitBackingFieldInExtension : KtFirDiagnostic<KtBackingField>() {
override val diagnosticClass get() = ExplicitBackingFieldInExtension::class
}
abstract class AbstractPropertyInPrimaryConstructorParameters : KtFirDiagnostic<KtModifierListOwner>() { abstract class AbstractPropertyInPrimaryConstructorParameters : KtFirDiagnostic<KtModifierListOwner>() {
override val diagnosticClass get() = AbstractPropertyInPrimaryConstructorParameters::class override val diagnosticClass get() = AbstractPropertyInPrimaryConstructorParameters::class
} }
@@ -2818,6 +2818,13 @@ internal class ExplicitBackingFieldInAbstractPropertyImpl(
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
} }
internal class ExplicitBackingFieldInExtensionImpl(
firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.ExplicitBackingFieldInExtension(), KtAbstractFirDiagnostic<KtBackingField> {
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
}
internal class AbstractPropertyInPrimaryConstructorParametersImpl( internal class AbstractPropertyInPrimaryConstructorParametersImpl(
firDiagnostic: FirPsiDiagnostic, firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken, override val token: ValidityToken,