diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertyChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertyChecker.kt index b9918582b4e..db2bc0b6df7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertyChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertyChecker.kt @@ -52,7 +52,7 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { if (isAbstract) { if (!containingDeclaration.canHaveAbstractDeclaration) { property.source?.let { - reporter.report(it, FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS) + reporter.report(FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS.on(it, property, containingDeclaration)) return } } @@ -60,21 +60,21 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { if (property.delegate != null) { property.delegate!!.source?.let { if (containingDeclaration.isInterface) { - reporter.report(FirErrors.DELEGATED_PROPERTY_IN_INTERFACE.on(it, property.delegate!!)) + reporter.report(it, FirErrors.DELEGATED_PROPERTY_IN_INTERFACE) } else { - reporter.report(FirErrors.ABSTRACT_DELEGATED_PROPERTY.on(it, property.delegate!!)) + reporter.report(it, FirErrors.ABSTRACT_DELEGATED_PROPERTY) } } } checkAccessor(property.getter, property.delegate) { src, symbol -> - reporter.report(FirErrors.ABSTRACT_PROPERTY_WITH_GETTER.on(src, symbol)) + reporter.report(src, FirErrors.ABSTRACT_PROPERTY_WITH_GETTER) } checkAccessor(property.setter, property.delegate) { src, symbol -> if (symbol.fir.visibility == Visibilities.Private && property.visibility != Visibilities.Private) { - reporter.report(FirErrors.PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY.on(src, symbol)) + reporter.report(src, FirErrors.PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY) } else { - reporter.report(FirErrors.ABSTRACT_PROPERTY_WITH_SETTER.on(src, symbol)) + reporter.report(src, FirErrors.ABSTRACT_PROPERTY_WITH_SETTER) } } } @@ -96,7 +96,7 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { if (isOpen) { checkAccessor(property.setter, property.delegate) { src, symbol -> if (symbol.fir.visibility == Visibilities.Private && property.visibility != Visibilities.Private) { - reporter.report(FirErrors.PRIVATE_SETTER_FOR_OPEN_PROPERTY.on(src, symbol)) + reporter.report(src, FirErrors.PRIVATE_SETTER_FOR_OPEN_PROPERTY) } } } @@ -110,15 +110,15 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { ) { property.initializer?.source?.let { if (propertyIsAbstract) { - reporter.report(FirErrors.ABSTRACT_PROPERTY_WITH_INITIALIZER.on(it, property.initializer!!)) + reporter.report(it, FirErrors.ABSTRACT_PROPERTY_WITH_INITIALIZER) } else if (containingDeclaration.isInterface) { - reporter.report(FirErrors.PROPERTY_INITIALIZER_IN_INTERFACE.on(it, property.initializer!!)) + reporter.report(it, FirErrors.PROPERTY_INITIALIZER_IN_INTERFACE) } } if (propertyIsAbstract) { if (property.initializer == null && property.delegate == null && property.returnTypeRef is FirImplicitTypeRef) { property.source?.let { - reporter.report(FirErrors.PROPERTY_WITH_NO_TYPE_NO_INITIALIZER.on(it, property.symbol)) + reporter.report(it, FirErrors.PROPERTY_WITH_NO_TYPE_NO_INITIALIZER) } } } 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 cf74faad14e..aad8fce9798 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 @@ -13,6 +13,11 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.PROP import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.SYMBOL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.SYMBOLS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.TO_STRING +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_DELEGATED_PROPERTY +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_PROPERTY_WITH_GETTER +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_PROPERTY_WITH_INITIALIZER +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_PROPERTY_WITH_SETTER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_SUPER_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.AMBIGUITY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_CLASS_MEMBER @@ -30,6 +35,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONFLICTING_PROJE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_IN_OBJECT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CYCLIC_CONSTRUCTOR_DELEGATION_CALL +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATED_PROPERTY_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_MODIFIER_PAIR @@ -75,8 +81,13 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NULLABLE_TYPE_OF_ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OTHER_ERROR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_PROPERTY_IN_INTERFACE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_SETTER_FOR_OPEN_PROPERTY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_INITIALIZER_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_WITH_NO_TYPE_NO_INITIALIZER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RECURSION_IN_IMPLICIT_TYPES import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RECURSION_IN_SUPERTYPES @@ -324,6 +335,30 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { TO_STRING ) + // Properties & accessors + map.put( + ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, + "Abstract property ''{0}'' in non-abstract class ''{1}''", + DECLARATION_NAME, + DECLARATION_NAME + ) + map.put(PRIVATE_PROPERTY_IN_INTERFACE, "Abstract property in an interface cannot be private") + + map.put(ABSTRACT_PROPERTY_WITH_INITIALIZER, "Property with initializer cannot be abstract") + map.put(PROPERTY_INITIALIZER_IN_INTERFACE, "Property initializers are not allowed in interfaces") + map.put( + PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, + "This property must either have a type annotation, be initialized or be delegated" + ) + + map.put(ABSTRACT_DELEGATED_PROPERTY, "Delegated property cannot be abstract") + map.put(DELEGATED_PROPERTY_IN_INTERFACE, "Delegated properties are not allowed in interfaces") + + map.put(ABSTRACT_PROPERTY_WITH_GETTER, "Property with getter implementation cannot be abstract") + map.put(ABSTRACT_PROPERTY_WITH_SETTER, "Property with setter implementation cannot be abstract") + map.put(PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY, "Private setters are not allowed for abstract properties") + map.put(PRIVATE_SETTER_FOR_OPEN_PROPERTY, "Private setters are not allowed for open properties") + // Control flow diagnostics map.put(UNINITIALIZED_VARIABLE, "{0} must be initialized before access", PROPERTY_NAME) map.put( diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 1933753b53d..6b7f951772b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -154,21 +154,21 @@ object FirErrors { val PRIVATE_FUNCTION_WITH_NO_BODY by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) // Properties & accessors - val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error0(SourceElementPositioningStrategies.MODALITY_MODIFIER) - val PRIVATE_PROPERTY_IN_INTERFACE by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) + val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error2(SourceElementPositioningStrategies.MODALITY_MODIFIER) + val PRIVATE_PROPERTY_IN_INTERFACE by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) - val ABSTRACT_PROPERTY_WITH_INITIALIZER by error1() - val PROPERTY_INITIALIZER_IN_INTERFACE by error1() - val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error1() + val ABSTRACT_PROPERTY_WITH_INITIALIZER by error0() + val PROPERTY_INITIALIZER_IN_INTERFACE by error0() + val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) - val ABSTRACT_DELEGATED_PROPERTY by error1() - val DELEGATED_PROPERTY_IN_INTERFACE by error1() + val ABSTRACT_DELEGATED_PROPERTY by error0() + val DELEGATED_PROPERTY_IN_INTERFACE by error0() // TODO: val ACCESSOR_FOR_DELEGATED_PROPERTY by error1() - val ABSTRACT_PROPERTY_WITH_GETTER by error1() - val ABSTRACT_PROPERTY_WITH_SETTER by error1() - val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error1() - val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error1() + val ABSTRACT_PROPERTY_WITH_GETTER by error0() + val ABSTRACT_PROPERTY_WITH_SETTER by error0() + val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error0() + val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error0() // Destructuring declaration val INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION by error0()