diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt index 0e24e36d23b..68a9f2b6da6 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt @@ -44,6 +44,7 @@ enum class PositioningStrategy(private val strategy: String) { LATEINIT_MODIFIER("LATEINIT_MODIFIER"), SELECTOR_BY_QUALIFIED("SELECTOR_BY_QUALIFIED"), REFERENCE_BY_QUALIFIED("REFERENCE_BY_QUALIFIED"), + PRIVATE_MODIFIER("PRIVATE_MODIFIER"), ; @@ -56,4 +57,4 @@ enum class PositioningStrategy(private val strategy: String) { fun DiagnosticData.hasDefaultPositioningStrategy(): Boolean = - positioningStrategy == PositioningStrategy.DEFAULT \ No newline at end of file + positioningStrategy == PositioningStrategy.DEFAULT 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 acb07a5ffb8..1913952e3c0 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 @@ -319,8 +319,8 @@ object DIAGNOSTICS_LIST : DiagnosticList() { val ABSTRACT_PROPERTY_WITH_GETTER by error() val ABSTRACT_PROPERTY_WITH_SETTER by error() - val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error() - val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error() + val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error(PositioningStrategy.PRIVATE_MODIFIER) + val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error(PositioningStrategy.PRIVATE_MODIFIER) val EXPECTED_PRIVATE_DECLARATION by error(PositioningStrategy.VISIBILITY_MODIFIER) } 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 f90befa3486..cea196d68cd 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 @@ -214,8 +214,8 @@ object FirErrors { val DELEGATED_PROPERTY_IN_INTERFACE by error0() 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() + val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error0(SourceElementPositioningStrategies.PRIVATE_MODIFIER) + val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error0(SourceElementPositioningStrategies.PRIVATE_MODIFIER) val EXPECTED_PRIVATE_DECLARATION by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) // Multi-platform projects diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt index a06ccdc442a..f129e7dc403 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt @@ -5,12 +5,13 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration -import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter +import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter import org.jetbrains.kotlin.fir.declarations.isLateInit import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeTypeParameterType @@ -71,8 +72,8 @@ object FirInapplicableLateinitChecker : FirPropertyChecker() { else -> type.isNullable } - private fun FirProperty.hasGetter() = getter != null && getter?.source != null && getter?.source?.kind !is FirFakeSourceElementKind - private fun FirProperty.hasSetter() = setter != null && setter?.source != null && setter?.source?.kind !is FirFakeSourceElementKind + private fun FirProperty.hasGetter() = getter != null && getter !is FirDefaultPropertyGetter + private fun FirProperty.hasSetter() = setter != null && setter !is FirDefaultPropertySetter private fun DiagnosticReporter.reportOn(source: FirSourceElement?, target: String, context: CheckerContext) { source?.let { report(FirErrors.INAPPLICABLE_LATEINIT_MODIFIER.on(it, target), context) } 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 33bfa76a7c3..e95a609ef20 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 @@ -71,14 +71,14 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { reporter.reportOn(it, FirErrors.ABSTRACT_DELEGATED_PROPERTY, context) } - checkAccessor(property.getter, property.delegate) { src, _ -> - reporter.reportOn(src, FirErrors.ABSTRACT_PROPERTY_WITH_GETTER, context) + checkAccessor(property.getter, property.delegate) { src, _, hasBody -> + if (hasBody) reporter.reportOn(src, FirErrors.ABSTRACT_PROPERTY_WITH_GETTER, context) } - checkAccessor(property.setter, property.delegate) { src, symbol -> - if (symbol.fir.visibility == Visibilities.Private && property.visibility != Visibilities.Private) { - reporter.reportOn(src, FirErrors.PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY, context) - } else { - reporter.reportOn(src, FirErrors.ABSTRACT_PROPERTY_WITH_SETTER, context) + checkAccessor(property.setter, property.delegate) { src, symbol, hasBody -> + when { + symbol.fir.visibility == Visibilities.Private && property.visibility != Visibilities.Private -> + reporter.reportOn(src, FirErrors.PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY, context) + hasBody -> reporter.reportOn(src, FirErrors.ABSTRACT_PROPERTY_WITH_SETTER, context) } } } @@ -98,7 +98,7 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { } val isOpen = property.isOpen || hasOpenModifier if (isOpen) { - checkAccessor(property.setter, property.delegate) { src, symbol -> + checkAccessor(property.setter, property.delegate) { src, symbol, _ -> if (symbol.fir.visibility == Visibilities.Private && property.visibility != Visibilities.Private) { reporter.reportOn(src, FirErrors.PRIVATE_SETTER_FOR_OPEN_PROPERTY, context) } @@ -111,11 +111,11 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { private fun checkAccessor( accessor: FirPropertyAccessor?, delegate: FirExpression?, - report: (FirSourceElement, FirPropertyAccessorSymbol) -> Unit, + report: (FirSourceElement, FirPropertyAccessorSymbol, hasBody: Boolean) -> Unit, ) { - if (accessor != null && accessor !is FirDefaultPropertyAccessor && accessor.hasBody && delegate == null) { + if (accessor != null && delegate == null) { accessor.source?.let { - report.invoke(it, accessor.symbol) + report.invoke(it, accessor.symbol, accessor.hasBody) } } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 25e02f27f9c..0e64b580e8d 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -347,8 +347,7 @@ class RawFirBuilder( } if (this == null || !hasBody()) { val propertySource = - if (this != null && hasBody()) property.toFirSourceElement() - else property.toFirPsiSourceElement(FirFakeSourceElementKind.DefaultAccessor) + this?.toFirSourceElement() ?: property.toFirPsiSourceElement(FirFakeSourceElementKind.DefaultAccessor) return FirDefaultPropertyAccessor .createGetterOrSetter( propertySource, diff --git a/compiler/testData/diagnostics/tests/AbstractAccessor.fir.kt b/compiler/testData/diagnostics/tests/AbstractAccessor.fir.kt index 3bfbc333f51..697c2c842c4 100644 --- a/compiler/testData/diagnostics/tests/AbstractAccessor.fir.kt +++ b/compiler/testData/diagnostics/tests/AbstractAccessor.fir.kt @@ -1,14 +1,14 @@ abstract class My { abstract var x: Int public get - private set + private set abstract val y: Int protected get abstract protected var z: Int internal get - private set + private set abstract internal val w: Int protected get @@ -17,5 +17,5 @@ abstract class My { protected set open var t: Int = 0 - private set -} \ No newline at end of file + private set +} diff --git a/compiler/testData/diagnostics/tests/AbstractInAbstractClass.fir.kt b/compiler/testData/diagnostics/tests/AbstractInAbstractClass.fir.kt index 974bcb1a127..c8969cdc372 100644 --- a/compiler/testData/diagnostics/tests/AbstractInAbstractClass.fir.kt +++ b/compiler/testData/diagnostics/tests/AbstractInAbstractClass.fir.kt @@ -9,8 +9,8 @@ abstract class MyAbstractClass() { var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } @@ -42,4 +42,4 @@ abstract class MyAbstractClass() { var l1: Int = 0; abstract get abstract set var n: Int abstract get abstract set(v: Int) {} -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/AbstractInTrait.fir.kt b/compiler/testData/diagnostics/tests/AbstractInTrait.fir.kt index 74eab4a6220..06c0e35b60c 100644 --- a/compiler/testData/diagnostics/tests/AbstractInTrait.fir.kt +++ b/compiler/testData/diagnostics/tests/AbstractInTrait.fir.kt @@ -7,10 +7,10 @@ interface MyTrait { abstract val a2: Int abstract val a3: Int = 1 - var b: Int private set - var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + var b: Int private set + var b1: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } @@ -42,4 +42,4 @@ interface MyTrait { var l1: Int = 0; abstract get abstract set var n: Int abstract get abstract set(v: Int) {} -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.fir.kt b/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.fir.kt index 352d5a17af6..aefc7148cae 100644 --- a/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.fir.kt +++ b/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.fir.kt @@ -31,40 +31,40 @@ class B : A, AA() { open class C : A, AA() { override var a: Int = 0 // Errors here and below - private set + private set override var b: Int = 1 - private set + private set override var c: Int = 2 - private set + private set override var d: Int = 3 - private set + private set } abstract class D : A, AA() { override var a: Int = 0 // Errors here and below - private set + private set override var b: Int = 1 - private set + private set override var c: Int = 2 - private set + private set override var d: Int = 3 - private set + private set } interface E : A { override var a: Int get() = 0 // Errors here and below - private set(arg) {} + private set(arg) {} override var b: Int get() = 0 - private set(arg) {} -} \ No newline at end of file + private set(arg) {} +} diff --git a/compiler/testData/diagnostics/tests/enum/AbstractInEnum.fir.kt b/compiler/testData/diagnostics/tests/enum/AbstractInEnum.fir.kt index 9d6169605a3..9e15ed3230c 100644 --- a/compiler/testData/diagnostics/tests/enum/AbstractInEnum.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/AbstractInEnum.fir.kt @@ -11,8 +11,8 @@ enum class MyEnum() { var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } @@ -44,4 +44,4 @@ enum class MyEnum() { var l1: Int = 0; abstract get abstract set var n: Int abstract get abstract set(v: Int) {} -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt b/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt index af00cc013bf..34ee0dbd565 100644 --- a/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt +++ b/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt @@ -5,11 +5,11 @@ interface Test { private val private_val: I var interlan_private_set: O - private set + private set public var public_private_set: O - private set + private set protected var protected_private_set: O - private set + private set private var private_private_set: O private set @@ -17,4 +17,4 @@ interface Test { public fun public_fun(i: O) : I protected fun protected_fun(i: O) : I private fun private_fun(i: O) : I -} \ No newline at end of file +} 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 a4c27aee84f..5c62ee4d561 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 @@ -653,11 +653,11 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = AbstractPropertyWithSetter::class } - abstract class PrivateSetterForAbstractProperty : KtFirDiagnostic() { + abstract class PrivateSetterForAbstractProperty : KtFirDiagnostic() { override val diagnosticClass get() = PrivateSetterForAbstractProperty::class } - abstract class PrivateSetterForOpenProperty : KtFirDiagnostic() { + abstract class PrivateSetterForOpenProperty : KtFirDiagnostic() { override val diagnosticClass get() = PrivateSetterForOpenProperty::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 3f2b120fa32..62a6a0a3dd0 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 @@ -1056,14 +1056,14 @@ internal class AbstractPropertyWithSetterImpl( internal class PrivateSetterForAbstractPropertyImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.PrivateSetterForAbstractProperty(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.PrivateSetterForAbstractProperty(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } internal class PrivateSetterForOpenPropertyImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.PrivateSetterForOpenProperty(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.PrivateSetterForOpenProperty(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) }