diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index 539443a4a34..817247114d4 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -117,6 +117,7 @@ object FirOverrideChecker : FirClassChecker() { overriddenSymbols: List>, context: CheckerContext ) { + if (overriddenSymbols.isEmpty()) return val visibilities = overriddenSymbols.map { it to it.visibility }.sortedBy { pair -> @@ -124,14 +125,29 @@ object FirOverrideChecker : FirClassChecker() { Visibilities.compare(visibility, pair.second) ?: Int.MIN_VALUE } - for ((overridden, overriddenVisibility) in visibilities) { - val compare = Visibilities.compare(visibility, overriddenVisibility) - if (compare == null) { - reporter.reportCannotChangeAccessPrivilege(this, overridden, context) - return - } else if (compare < 0) { - reporter.reportCannotWeakenAccessPrivilege(this, overridden, context) - return + if (this is FirPropertySymbol) { + getterSymbol?.checkVisibility( + containingClass, + reporter, + overriddenSymbols.map { (it as FirPropertySymbol).getterSymbol ?: it }, + context + ) + setterSymbol?.checkVisibility( + containingClass, + reporter, + overriddenSymbols.mapNotNull { (it as FirPropertySymbol).setterSymbol }, + context + ) + } else { + for ((overridden, overriddenVisibility) in visibilities) { + val compare = Visibilities.compare(visibility, overriddenVisibility) + if (compare == null) { + reporter.reportCannotChangeAccessPrivilege(this, overridden, context) + break + } else if (compare < 0) { + reporter.reportCannotWeakenAccessPrivilege(this, overridden, context) + break + } } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 93e6cf3b0c5..8a099c82b4a 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -623,7 +623,11 @@ class DeclarationsConverter( ) //parse primary constructor convertPrimaryConstructor( - primaryConstructor, delegatedSelfType.source, classWrapper, delegatedConstructorSource, containingClassIsExpectClass = false + primaryConstructor, + delegatedSelfType.source, + classWrapper, + delegatedConstructorSource, + containingClassIsExpectClass = false )?.let { this.declarations += it.firConstructor } delegateFields?.let { this.declarations += it } @@ -710,7 +714,7 @@ class DeclarationsConverter( enumClassWrapper, superTypeCallEntry?.toFirSourceElement(), isEnumEntry = true, - containingClassIsExpectClass = false + containingClassIsExpectClass = false )?.let { declarations += it.firConstructor } classBodyNode?.also { // Use ANONYMOUS_OBJECT_NAME for the owner class id of enum entry declarations @@ -1117,7 +1121,11 @@ class DeclarationsConverter( val convertedAccessors = accessors.map { convertGetterOrSetter(it, returnType, propertyVisibility, modifiers) } this.getter = convertedAccessors.find { it.isGetter } ?: FirDefaultPropertyGetter( - null, moduleData, FirDeclarationOrigin.Source, returnType, propertyVisibility + property.toFirSourceElement(FirFakeSourceElementKind.DefaultAccessor), + moduleData, + FirDeclarationOrigin.Source, + returnType, + propertyVisibility ).also { it.status = defaultAccessorStatus() it.initContainingClassAttr() @@ -1126,7 +1134,11 @@ class DeclarationsConverter( this.setter = convertedAccessors.find { it.isSetter } ?: if (isVar) { FirDefaultPropertySetter( - null, moduleData, FirDeclarationOrigin.Source, returnType, propertyVisibility + property.toFirSourceElement(FirFakeSourceElementKind.DefaultAccessor), + moduleData, + FirDeclarationOrigin.Source, + returnType, + propertyVisibility ).also { it.status = defaultAccessorStatus() it.initContainingClassAttr() diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index 3c852020e00..f9421945582 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -75,15 +75,16 @@ class ValueParameter( isLateInit = false } annotations += this@ValueParameter.firValueParameter.annotations + val defaultAccessorSource = propertySource?.fakeElement(FirFakeSourceElementKind.DefaultAccessor) getter = FirDefaultPropertyGetter( - null, + defaultAccessorSource, moduleData, FirDeclarationOrigin.Source, type.copyWithNewSourceKind(FirFakeSourceElementKind.DefaultAccessor), modifiers.getVisibility() ) setter = if (this.isVar) FirDefaultPropertySetter( - null, + defaultAccessorSource, moduleData, FirDeclarationOrigin.Source, type.copyWithNewSourceKind(FirFakeSourceElementKind.DefaultAccessor), diff --git a/compiler/testData/diagnostics/tests/OverridenSetterVisibility.fir.kt b/compiler/testData/diagnostics/tests/OverridenSetterVisibility.fir.kt deleted file mode 100644 index 9d9d797028f..00000000000 --- a/compiler/testData/diagnostics/tests/OverridenSetterVisibility.fir.kt +++ /dev/null @@ -1,29 +0,0 @@ -public interface ITest { - public var prop : Int - get() = 12 - set(value) {} -} - -abstract class ATest { - protected open var prop2 : Int - get() = 13 - set(value) {} -} - -class Test: ATest(), ITest { - override var prop : Int - get() = 12 - private set(value) {} - - override var prop2 : Int - get() = 14 - internal set(value) {} -} - -fun main() { - val test = Test() - test.prop = 12 - - val itest: ITest = test - itest.prop = 12 // No error here -} diff --git a/compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt b/compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt index b0faa7dcb3d..58df8486b5e 100644 --- a/compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt +++ b/compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL public interface ITest { public var prop : Int get() = 12 diff --git a/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.fir.kt b/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.fir.kt deleted file mode 100644 index aefc7148cae..00000000000 --- a/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.fir.kt +++ /dev/null @@ -1,70 +0,0 @@ -// See KT-10325: private setters are allowed for overridden properties in final class - -interface A { - val a: Int - - var b: Int -} - -abstract class AA { - abstract val c: Int - - abstract var d: Int -} - -class B : A, AA() { - override var a: Int = 0 - // Ok - private set - - override var b: Int = 1 - private set - - override var c: Int = 2 - // Ok - private set - - override var d: Int = 3 - private set -} - -open class C : A, AA() { - override var a: Int = 0 - // Errors here and below - private set - - override var b: Int = 1 - private set - - override var c: Int = 2 - private set - - override var d: Int = 3 - private set -} - -abstract class D : A, AA() { - override var a: Int = 0 - // Errors here and below - private set - - override var b: Int = 1 - private set - - override var c: Int = 2 - private set - - override var d: Int = 3 - private set -} - -interface E : A { - override var a: Int - get() = 0 - // Errors here and below - private set(arg) {} - - override var b: Int - get() = 0 - private set(arg) {} -} diff --git a/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.kt b/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.kt index 6340deb2b13..ba504472dd3 100644 --- a/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.kt +++ b/compiler/testData/diagnostics/tests/PrivateSetterForOverridden.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // See KT-10325: private setters are allowed for overridden properties in final class interface A {