From a12faf5baf803ca31da6b2a2ec15d7858b3817ef Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 20 Apr 2016 18:18:32 +0300 Subject: [PATCH] KtDeclaration.containingClassOrObject now works correctly for primary constructor and its parameters #KT-11982 Fixed --- .../jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt | 11 ++++++++++- .../inspectionData/expected.xml | 16 ++++++++++++++++ .../redundantModalityModifier.kt | 12 ++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) 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 +}