From 2de0e4b8d293af3cf0ecf2ee83b1d1d5b2378d24 Mon Sep 17 00:00:00 2001 From: Stanislav Ruban Date: Fri, 1 Mar 2024 14:17:47 +0200 Subject: [PATCH] [FIR][checkers] Respect ClassKind.INTERFACE in FirRegularClass.canHaveAbstractDeclaration A Kotlin interface can have abstract members regardless of its modality. However, this invariant was previously ignored by FIR checkers. As a result, false-positive `ABSTRACT__IN_NON_ABSTRACT_CLASS` errors were being reported in explicitly non-abstract interfaces. This commit makes a relevant FIR utility used by relevant FIR checkers aware of the aforementioned invariant. #KT-66260 Fixed --- .../fir/declarations/utils/FirStatusUtils.kt | 2 +- .../tests/modifiers/OpenInterface.fir.kt | 15 --------------- .../tests/modifiers/OpenInterface.fir.txt | 2 +- .../diagnostics/tests/modifiers/OpenInterface.kt | 1 + 4 files changed, 3 insertions(+), 17 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/modifiers/OpenInterface.fir.kt diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirStatusUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirStatusUtils.kt index 08198e8e537..9645e4c4aa1 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirStatusUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirStatusUtils.kt @@ -62,7 +62,7 @@ inline val FirClass.isEnumClass: Boolean inline val FirRegularClass.isSealed: Boolean get() = status.modality == Modality.SEALED inline val FirRegularClass.canHaveAbstractDeclaration: Boolean - get() = isAbstract || isSealed || isEnumClass + get() = isInterface || isAbstract || isSealed || isEnumClass inline val FirRegularClass.isCompanion: Boolean get() = status.isCompanion inline val FirRegularClass.isData: Boolean get() = status.isData diff --git a/compiler/testData/diagnostics/tests/modifiers/OpenInterface.fir.kt b/compiler/testData/diagnostics/tests/modifiers/OpenInterface.fir.kt deleted file mode 100644 index 954d270a9fb..00000000000 --- a/compiler/testData/diagnostics/tests/modifiers/OpenInterface.fir.kt +++ /dev/null @@ -1,15 +0,0 @@ -// FIR_DUMP -open interface OpenInterface { - fun defaultModalityFuncWithoutBody() - fun defaultModalityFuncWithBody() {} - abstract fun abstractFunc() - open fun openFunc() {} - - val defaultModalityValWithoutGetter: Any - val defaultModalityValWithGetter: Any get() = 42 - abstract val abstractVal: Any - open val openVal: Any get() = 42 - - abstract val abstractValWithGetter: Any get() = 42 - abstract var abstractValWithSetter: Any set(value) {} -} diff --git a/compiler/testData/diagnostics/tests/modifiers/OpenInterface.fir.txt b/compiler/testData/diagnostics/tests/modifiers/OpenInterface.fir.txt index c4a46d68c19..861da4d53ce 100644 --- a/compiler/testData/diagnostics/tests/modifiers/OpenInterface.fir.txt +++ b/compiler/testData/diagnostics/tests/modifiers/OpenInterface.fir.txt @@ -1,4 +1,4 @@ -FILE: OpenInterface.fir.kt +FILE: OpenInterface.kt public open interface OpenInterface : R|kotlin/Any| { public abstract fun defaultModalityFuncWithoutBody(): R|kotlin/Unit| diff --git a/compiler/testData/diagnostics/tests/modifiers/OpenInterface.kt b/compiler/testData/diagnostics/tests/modifiers/OpenInterface.kt index f6e7e321a6c..92dcf0cc1e5 100644 --- a/compiler/testData/diagnostics/tests/modifiers/OpenInterface.kt +++ b/compiler/testData/diagnostics/tests/modifiers/OpenInterface.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FIR_DUMP open interface OpenInterface { fun defaultModalityFuncWithoutBody()