diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.fir.txt index eb9b6be8d6f..cf1b8745a84 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.fir.txt @@ -18,6 +18,8 @@ FILE: RedundantModalityModifierChecker.kt private final fun bar(): R|kotlin/Unit| + public abstract fun loo(): R|kotlin/Unit| + public open fun goo(): R|kotlin/Unit| { } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt index 14e11b07b99..08b739cc5db 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt @@ -12,6 +12,7 @@ interface Interface { // error private final fun bar() + open fun loo() open fun goo() {} abstract fun tar() @@ -84,7 +85,7 @@ abstract class AbstractDerived2 : Interface { // Redundant final object final object FinalObject // Open interface -open interface OpenInterface +open interface OpenInterface class FinalDerived2(override final val gav: Int) : Base() { override fun bar() {} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index 07b7f2e9365..563231b1f94 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -221,25 +221,26 @@ fun FirClass.modality(): Modality? { } /** - * returns implicit modality by FirMemberDeclaration<*> + * Returns a set of [Modality] modifiers which are redundant for the given [FirMemberDeclaration]. If a modality modifier is redundant, the + * declaration's modality won't be changed by the modifier. */ -fun FirMemberDeclaration.implicitModality(context: CheckerContext): Modality { +fun FirMemberDeclaration.redundantModalities(context: CheckerContext): Set { if (this is FirRegularClass) { return when (classKind) { - ClassKind.INTERFACE -> Modality.ABSTRACT - else -> Modality.FINAL + ClassKind.INTERFACE -> setOf(Modality.ABSTRACT, Modality.OPEN) + else -> setOf(Modality.FINAL) } } - val containingClass = context.findClosestClassOrObject() ?: return Modality.FINAL + val containingClass = context.findClosestClassOrObject() ?: return setOf(Modality.FINAL) return when { - isOverride && !containingClass.isFinal -> Modality.OPEN + isOverride && !containingClass.isFinal -> setOf(Modality.OPEN) containingClass.isInterface -> when { - hasBody() -> Modality.OPEN - else -> Modality.ABSTRACT + hasBody() -> setOf(Modality.OPEN) + else -> setOf(Modality.ABSTRACT, Modality.OPEN) } - else -> Modality.FINAL + else -> setOf(Modality.FINAL) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierSyntaxChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierSyntaxChecker.kt index 052fed98b87..cbecfc375ea 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierSyntaxChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierSyntaxChecker.kt @@ -10,13 +10,13 @@ import org.jetbrains.kotlin.KtRealSourceElementKind import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.implicitModality -import org.jetbrains.kotlin.fir.analysis.checkers.syntax.FirDeclarationSyntaxChecker import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_MODALITY_MODIFIER import org.jetbrains.kotlin.diagnostics.modalityModifier import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.redundantModalities +import org.jetbrains.kotlin.fir.analysis.checkers.syntax.FirDeclarationSyntaxChecker +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_MODALITY_MODIFIER import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration @@ -46,8 +46,8 @@ object RedundantModalityModifierSyntaxChecker : FirDeclarationSyntaxChecker