diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationCheckerUtils.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationCheckerUtils.kt index 8d2a9dfdee3..53b2ab12752 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationCheckerUtils.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDeclarationCheckerUtils.kt @@ -29,10 +29,10 @@ internal fun isInsideExternalClass(containingClass: FirRegularClass, context: Ch private inline fun isInsideSpecificClass( containingClass: FirRegularClass, context: CheckerContext, - specificStatus: (FirRegularClass) -> Boolean + predicate: (FirRegularClass) -> Boolean ): Boolean = - specificStatus.invoke(containingClass) || - context.containingDeclarations.asReversed().any { it is FirRegularClass && specificStatus.invoke(it) } + predicate.invoke(containingClass) || + context.containingDeclarations.asReversed().any { it is FirRegularClass && predicate.invoke(it) } internal fun FirMemberDeclaration.isEffectivelyExpect( containingClass: FirRegularClass?, 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 c4ca4399d84..2f3241cd880 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 @@ -1151,7 +1151,7 @@ class DeclarationsConverter( } val status = // Downward propagation of `inline` and `external` modifiers (from property to its accessors) - FirDeclarationStatusImpl(accessorVisibility, Modality.FINAL).apply { + FirDeclarationStatusImpl(accessorVisibility, modifiers.getModality()).apply { isInline = propertyModifiers.hasInline() || modifiers.hasInline() isExternal = propertyModifiers.hasExternal() || modifiers.hasExternal() } 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 4550ff88108..833ef2266f6 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 @@ -339,7 +339,7 @@ class RawFirBuilder( if (this?.visibility != null && this.visibility != Visibilities.Unknown) this.visibility else property.visibility // Downward propagation of `inline` and `external` modifiers (from property to its accessors) val status = - FirDeclarationStatusImpl(accessorVisibility, Modality.FINAL).apply { + FirDeclarationStatusImpl(accessorVisibility, this?.modality).apply { isInline = property.hasModifier(INLINE_KEYWORD) || this@toFirPropertyAccessor?.hasModifier(INLINE_KEYWORD) == true isExternal = property.hasModifier(EXTERNAL_KEYWORD) || diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt index 8c6fdaadfcf..4363d91b986 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt @@ -195,8 +195,8 @@ val FirProperty.hasBackingField: Boolean else -> { val getter = getter ?: return true if (isVar && setter == null) return true - if (setter?.hasBody == false) return true - if (!getter.hasBody) return true + if (setter?.hasBody == false && setter?.isAbstract == false) return true + if (!getter.hasBody && !getter.isAbstract) return true return isReferredViaField == true } diff --git a/compiler/testData/diagnostics/tests/Abstract.fir.kt b/compiler/testData/diagnostics/tests/Abstract.fir.kt index f6db0ed7c51..19b0ef410ec 100644 --- a/compiler/testData/diagnostics/tests/Abstract.fir.kt +++ b/compiler/testData/diagnostics/tests/Abstract.fir.kt @@ -28,19 +28,19 @@ package MyPackage abstract fun j() {} //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i: Int abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int = 0; get() = i; abstract set var k: Int abstract set var k1: Int = 0; abstract set - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set + var l: Int abstract get abstract set + var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + var n: Int abstract get abstract set(v: Int) {} // FILE: c.kt //creating an instance diff --git a/compiler/testData/diagnostics/tests/AbstractInAbstractClass.fir.kt b/compiler/testData/diagnostics/tests/AbstractInAbstractClass.fir.kt index d01739ce4a8..f8859609213 100644 --- a/compiler/testData/diagnostics/tests/AbstractInAbstractClass.fir.kt +++ b/compiler/testData/diagnostics/tests/AbstractInAbstractClass.fir.kt @@ -29,18 +29,17 @@ abstract class MyAbstractClass() { abstract fun j() {} //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i: Int abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int get() = i; abstract set var k: Int abstract set var k1: Int = 0; abstract set - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set + var l: Int abstract get abstract set + var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + var n: Int abstract get abstract set(v: Int) {} } - diff --git a/compiler/testData/diagnostics/tests/AbstractInClass.fir.kt b/compiler/testData/diagnostics/tests/AbstractInClass.fir.kt index aeae285f020..55ef524ba2f 100644 --- a/compiler/testData/diagnostics/tests/AbstractInClass.fir.kt +++ b/compiler/testData/diagnostics/tests/AbstractInClass.fir.kt @@ -29,17 +29,17 @@ class MyClass() { abstract fun j() {} //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i: Int abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int = 0; get() = i; abstract set var k: Int abstract set var k1: Int = 0; abstract set - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set + var l: Int abstract get abstract set + var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + 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 06c0e35b60c..7c6b7289096 100644 --- a/compiler/testData/diagnostics/tests/AbstractInTrait.fir.kt +++ b/compiler/testData/diagnostics/tests/AbstractInTrait.fir.kt @@ -32,8 +32,8 @@ interface MyTrait { var i: Int abstract get abstract set var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int = 0; get() = i; abstract set var k: Int abstract set var k1: Int = 0; abstract set @@ -41,5 +41,5 @@ interface MyTrait { var l: Int abstract get abstract set var l1: Int = 0; abstract get abstract set - var n: Int abstract get abstract set(v: Int) {} + var n: Int abstract get abstract set(v: Int) {} } diff --git a/compiler/testData/diagnostics/tests/enum/AbstractInEnum.fir.kt b/compiler/testData/diagnostics/tests/enum/AbstractInEnum.fir.kt index 6f4251672c1..fc5796e8d56 100644 --- a/compiler/testData/diagnostics/tests/enum/AbstractInEnum.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/AbstractInEnum.fir.kt @@ -31,17 +31,17 @@ enum class MyEnum() { abstract fun j() {} //property accessors - var i: Int abstract get abstract set - var i1: Int = 0; abstract get abstract set + var i: Int abstract get abstract set + var i1: Int = 0; abstract get abstract set - var j: Int get() = i; abstract set - var j1: Int = 0; get() = i; abstract set + var j: Int get() = i; abstract set + var j1: Int = 0; get() = i; abstract set var k: Int abstract set var k1: Int = 0; abstract set - var l: Int abstract get abstract set - var l1: Int = 0; abstract get abstract set - - var n: Int abstract get abstract set(v: Int) {} + var l: Int abstract get abstract set + var l1: Int = 0; abstract get abstract set + var n: Int abstract get abstract set(v: Int) {} +}