diff --git a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.kt b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.kt index b5abdd454fe..949e5551315 100644 --- a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.kt +++ b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.kt @@ -1,12 +1,22 @@ +object O { + fun foo() {} +} + // Interface interface Interface { - // Redundant + // Questionable cuz compiler reports warning here in FE 1.0 open val gav: Int get() = 42 // Redundant abstract fun foo() - // Redundant - private final fun bar() {} + // error + private final fun bar() {} + + open fun goo() {} + abstract fun tar() + + // error + abstract fun too() {} } interface B { abstract var bar: Unit @@ -51,8 +61,8 @@ open class OpenDerived : Base() { interface Derived : Interface { // Redundant override open fun foo() {} - // Redundant - final class Nested + // error + final class Nested } // Derived abstract class abstract class AbstractDerived1(override final val gav: Int) : Interface { diff --git a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.txt b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.txt index 7d637da8e61..622cc81c0f7 100644 --- a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.txt +++ b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.txt @@ -1,4 +1,13 @@ FILE: RedundantModalityModifierChecker.kt + public final object O : R|kotlin/Any| { + private constructor(): R|O| { + super() + } + + public final fun foo(): R|kotlin/Unit| { + } + + } public abstract interface Interface : R|kotlin/Any| { public open val gav: R|kotlin/Int| public get(): R|kotlin/Int| { @@ -10,6 +19,14 @@ FILE: RedundantModalityModifierChecker.kt private final fun bar(): R|kotlin/Unit| { } + public open fun goo(): R|kotlin/Unit| { + } + + public abstract fun tar(): R|kotlin/Unit| + + public abstract fun too(): R|kotlin/Unit| { + } + } public abstract interface B : R|kotlin/Any| { public abstract var bar: R|kotlin/Unit| diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantExplicitTypeChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantExplicitTypeChecker.kt index e4b942d0d7e..9f4555a6e17 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantExplicitTypeChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantExplicitTypeChecker.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.types.coneType -import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.name.ClassId object RedundantExplicitTypeChecker : FirMemberDeclarationChecker() { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierChecker.kt index 734bd6d8f0c..5d74ff8fed5 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierChecker.kt @@ -6,12 +6,14 @@ package org.jetbrains.kotlin.fir.analysis.checkers.extended import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirFakeSourceElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirMemberDeclarationChecker import org.jetbrains.kotlin.fir.analysis.checkers.implicitModality import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_MODALITY_MODIFIER +import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.toFirPsiSourceElement @@ -26,6 +28,11 @@ object RedundantModalityModifierChecker : FirMemberDeclarationChecker() { val modalityModifier = (declaration.psi as? KtDeclaration)?.modalityModifier() ?: return val modality = (modalityModifier as? LeafPsiElement)?.elementType as? KtModifierKeywordToken ?: return + if ( + modality == KtTokens.FINAL_KEYWORD + && (context.containingDeclarations.last() as? FirClass<*>)?.classKind == ClassKind.INTERFACE + ) return + val implicitModality = declaration.implicitModality(context) if (modality != implicitModality) return diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantVisibilityModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantVisibilityModifierChecker.kt index da8a807bc2a..386f3526693 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantVisibilityModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantVisibilityModifierChecker.kt @@ -26,7 +26,7 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() { if (declaration.source is FirFakeSourceElement<*>) return if ( declaration !is FirMemberDeclaration - && !(declaration is FirPropertyAccessor && declaration.visibility == context.lastInContainingDeclarationsVisibility) + && !(declaration is FirPropertyAccessor && declaration.visibility == context.containingPropertyVisibility) ) return val modifierList = (declaration.source.getModifierList() as? FirPsiModifierList)?.modifierList ?: return @@ -122,6 +122,6 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() { else -> false } - private val CheckerContext.lastInContainingDeclarationsVisibility - get() = (this.containingDeclarations.last() as FirProperty).visibility + private val CheckerContext.containingPropertyVisibility + get() = (this.containingDeclarations.last() as? FirProperty)?.visibility }