From ff63ba4dc1e91aa7be80f8b50ae2fef23faf8e4f Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 11 Apr 2018 17:31:22 +0300 Subject: [PATCH] Add inspection: redundant internal in local anonymous object / class So #KT-23617 Fixed --- .../RedundantVisibilityModifierInspection.kt | 26 ++++++++++++++----- .../inspectionData/expected.xml | 16 ++++++++++++ .../redundantVisibilityModifier.kt | 17 ++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantVisibilityModifierInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantVisibilityModifierInspection.kt index fac5275c6a8..d693891ebe9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantVisibilityModifierInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantVisibilityModifierInspection.kt @@ -9,7 +9,9 @@ import com.intellij.codeInspection.* import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.idea.core.implicitVisibility import org.jetbrains.kotlin.idea.quickfix.RemoveModifierFix +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.declarationVisitor +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier class RedundantVisibilityModifierInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { @@ -17,12 +19,24 @@ class RedundantVisibilityModifierInspection : AbstractKotlinInspection(), Cleanu return declarationVisitor { declaration -> val visibilityModifier = declaration.visibilityModifier() ?: return@declarationVisitor val implicitVisibility = declaration.implicitVisibility() - if (visibilityModifier.node.elementType == implicitVisibility) { - holder.registerProblem(visibilityModifier, - "Redundant visibility modifier", - ProblemHighlightType.LIKE_UNUSED_SYMBOL, - IntentionWrapper(RemoveModifierFix(declaration, implicitVisibility, isRedundant = true), - declaration.containingFile)) + val redundantVisibility = when { + visibilityModifier.node.elementType == implicitVisibility -> + implicitVisibility + declaration.hasModifier(KtTokens.INTERNAL_KEYWORD) && declaration.containingClassOrObject?.isLocal == true -> + KtTokens.INTERNAL_KEYWORD + else -> + null + } + if (redundantVisibility != null) { + holder.registerProblem( + visibilityModifier, + "Redundant visibility modifier", + ProblemHighlightType.LIKE_UNUSED_SYMBOL, + IntentionWrapper( + RemoveModifierFix(declaration, redundantVisibility, isRedundant = true), + declaration.containingFile + ) + ) } } } diff --git a/idea/testData/inspections/redundantVisibilityModifier/inspectionData/expected.xml b/idea/testData/inspections/redundantVisibilityModifier/inspectionData/expected.xml index 446bcf69b1d..bd24667cf78 100644 --- a/idea/testData/inspections/redundantVisibilityModifier/inspectionData/expected.xml +++ b/idea/testData/inspections/redundantVisibilityModifier/inspectionData/expected.xml @@ -43,4 +43,20 @@ Redundant visibility modifier Redundant visibility modifier + + redundantVisibilityModifier.kt + 40 + light_idea_test_case + + Redundant visibility modifier + Redundant visibility modifier + + + redundantVisibilityModifier.kt + 46 + light_idea_test_case + + Redundant visibility modifier + Redundant visibility modifier + diff --git a/idea/testData/inspections/redundantVisibilityModifier/redundantVisibilityModifier.kt b/idea/testData/inspections/redundantVisibilityModifier/redundantVisibilityModifier.kt index 2b48e98b44a..aeec17baf76 100644 --- a/idea/testData/inspections/redundantVisibilityModifier/redundantVisibilityModifier.kt +++ b/idea/testData/inspections/redundantVisibilityModifier/redundantVisibilityModifier.kt @@ -30,3 +30,20 @@ sealed class G constructor(val y: Int) { object H : G() } + +interface I { + fun bar() +} + +fun f() { + val i = object : I { + internal var foo = 0 + override fun bar() {} + } + i.foo = 1 + + class LocalClass { + internal var foo = 0 + } + LocalClass().foo = 1 +} \ No newline at end of file