diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index 60fe50cd8cb..02bb23d2d0b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -93,9 +93,7 @@ object ModifierCheckerCore { // NOTE: redundant targets must be possible! private val redundantTargetMap = mapOf>( - ABSTRACT_KEYWORD to EnumSet.of(INTERFACE), - OPEN_KEYWORD to EnumSet.of(INTERFACE), - FINAL_KEYWORD to EnumSet.of(ENUM_CLASS, OBJECT) + OPEN_KEYWORD to EnumSet.of(INTERFACE) ) val possibleParentTargetMap = mapOf>( diff --git a/compiler/testData/diagnostics/tests/declarationChecks/illegalModifiersOnClass.kt b/compiler/testData/diagnostics/tests/declarationChecks/illegalModifiersOnClass.kt index 21f9b743c2e..a2f8773eb3c 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/illegalModifiersOnClass.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/illegalModifiersOnClass.kt @@ -6,13 +6,13 @@ override companion object {} open companion object {} abstract companion object {} - final companion object {} + final companion object {} } override object B1 {} open object B2 {} abstract object B3 {} -final object B4 {} +final object B4 {} override enum class C {} override interface D {} diff --git a/compiler/testData/diagnostics/tests/modifiers/redundantTargets.kt b/compiler/testData/diagnostics/tests/modifiers/redundantTargets.kt index f2335767c41..267c8825d3c 100644 --- a/compiler/testData/diagnostics/tests/modifiers/redundantTargets.kt +++ b/compiler/testData/diagnostics/tests/modifiers/redundantTargets.kt @@ -1,10 +1,10 @@ open interface First - -abstract interface Second - -final enum class Third { +// Now inspection +abstract interface Second +// Now inspection +final enum class Third { FOURTH, FIFTH } - -final object Sixth \ No newline at end of file +// Now inspection +final object Sixth \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt index 27e5acd1136..158fc3b5dc0 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt @@ -229,7 +229,10 @@ fun KtModifierListOwner.canBeProtected(): Boolean { } fun KtDeclaration.implicitModality(): KtModifierKeywordToken { - if (this is KtClassOrObject) return KtTokens.FINAL_KEYWORD + if (this is KtClassOrObject) { + if (this is KtClass && this.isInterface()) return KtTokens.ABSTRACT_KEYWORD + return KtTokens.FINAL_KEYWORD + } val klass = containingClassOrObject ?: return KtTokens.FINAL_KEYWORD if (hasModifier(KtTokens.OVERRIDE_KEYWORD)) { if (klass.hasModifier(KtTokens.ABSTRACT_KEYWORD) || diff --git a/idea/testData/inspections/redundantModalityModifier/inspectionData/expected.xml b/idea/testData/inspections/redundantModalityModifier/inspectionData/expected.xml index ebf948d4c38..8641647ae90 100644 --- a/idea/testData/inspections/redundantModalityModifier/inspectionData/expected.xml +++ b/idea/testData/inspections/redundantModalityModifier/inspectionData/expected.xml @@ -87,4 +87,20 @@ Redundant modality modifier Redundant modality modifier + + redundantModalityModifier.kt + 56 + light_idea_test_case + + Redundant modality modifier + Redundant modality modifier + + + redundantModalityModifier.kt + 58 + light_idea_test_case + + Redundant modality modifier + Redundant modality modifier + \ No newline at end of file diff --git a/idea/testData/inspections/redundantModalityModifier/redundantModalityModifier.kt b/idea/testData/inspections/redundantModalityModifier/redundantModalityModifier.kt index 524b9073fb0..a0dc4ac66ae 100644 --- a/idea/testData/inspections/redundantModalityModifier/redundantModalityModifier.kt +++ b/idea/testData/inspections/redundantModalityModifier/redundantModalityModifier.kt @@ -52,3 +52,9 @@ abstract class AbstractDerived2 : Interface { // Redundant override open val gav = 13 } +// Redundant abstract interface +abstract interface AbstractInterface +// Redundant final object +final object FinalObject +// Open interface +open interface OpenInterface