[FIR] Forbid explicit backing fields in extension properties
This commit is contained in:
committed by
TeamCityServer
parent
d5ddd3cee3
commit
2aafe84eef
+1
@@ -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)
|
||||||
|
|||||||
+1
-1
@@ -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>
|
||||||
|
|||||||
+7
-4
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+5
@@ -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")
|
||||||
|
|||||||
+6
@@ -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,
|
||||||
|
|||||||
+4
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+7
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user