diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt
index f578695e96d..955334a38ec 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt
@@ -415,8 +415,17 @@ fun KtDeclaration.modalityModifier() = modifierFromTokenSet(MODALITY_MODIFIERS)
fun KtStringTemplateExpression.isPlain() = entries.all { it is KtLiteralStringTemplateEntry }
fun KtStringTemplateExpression.isPlainWithEscapes() = entries.all { it is KtLiteralStringTemplateEntry || it is KtEscapeStringTemplateEntry }
+// Correct for class members only (including constructors and nested classes)
+// Returns null e.g. for member function parameters, member function locals, property accessors
val KtDeclaration.containingClassOrObject: KtClassOrObject?
- get() = (parent as? KtClassBody)?.parent as? KtClassOrObject
+ get() = parent.let {
+ when (it) {
+ is KtClassBody -> it.parent as? KtClassOrObject
+ is KtClassOrObject -> it
+ is KtParameterList -> (it.parent as? KtPrimaryConstructor)?.getContainingClassOrObject()
+ else -> null
+ }
+ }
fun KtExpression.getOutermostParenthesizerOrThis(): KtExpression {
return (parentsWithSelf.zip(parents)).firstOrNull {
diff --git a/idea/testData/inspections/redundantModalityModifier/inspectionData/expected.xml b/idea/testData/inspections/redundantModalityModifier/inspectionData/expected.xml
index 5f6e52271a1..ebf948d4c38 100644
--- a/idea/testData/inspections/redundantModalityModifier/inspectionData/expected.xml
+++ b/idea/testData/inspections/redundantModalityModifier/inspectionData/expected.xml
@@ -71,4 +71,20 @@
Redundant modality modifier
Redundant modality modifier
+
+ redundantModalityModifier.kt
+ 46
+ light_idea_test_case
+
+ Redundant modality modifier
+ Redundant modality modifier
+
+
+ redundantModalityModifier.kt
+ 53
+ 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 513d79936c0..524b9073fb0 100644
--- a/idea/testData/inspections/redundantModalityModifier/redundantModalityModifier.kt
+++ b/idea/testData/inspections/redundantModalityModifier/redundantModalityModifier.kt
@@ -40,3 +40,15 @@ interface Derived : Interface {
// Redundant
final class Nested
}
+// Derived abstract class
+abstract class AbstractDerived1(override final val gav: Int) : Interface {
+ // Redundant
+ override open fun foo() {}
+}
+// Derived abstract class
+abstract class AbstractDerived2 : Interface {
+ // Final
+ override final fun foo() {}
+ // Redundant
+ override open val gav = 13
+}