inspection and code cleanup for redundant visibility modifiers

This commit is contained in:
Dmitry Jemerov
2016-01-05 13:31:43 +01:00
parent b736880787
commit e47e9f6763
11 changed files with 151 additions and 7 deletions
@@ -166,6 +166,17 @@ public fun KtClass.getOrCreateCompanionObject() : KtObjectDeclaration {
//TODO: code style option whether to insert redundant 'public' keyword or not
public fun KtDeclaration.setVisibility(visibilityModifier: KtModifierKeywordToken) {
val defaultVisibilityKeyword = implicitVisibility()
if (visibilityModifier == defaultVisibilityKeyword) {
this.visibilityModifierType()?.let { removeModifier(it) }
return
}
addModifier(visibilityModifier)
}
fun KtDeclaration.implicitVisibility(): KtModifierKeywordToken? {
val defaultVisibilityKeyword = if (hasModifier(KtTokens.OVERRIDE_KEYWORD)) {
(resolveToDescriptor() as? CallableMemberDescriptor)
?.overriddenDescriptors
@@ -175,13 +186,7 @@ public fun KtDeclaration.setVisibility(visibilityModifier: KtModifierKeywordToke
else {
KtTokens.DEFAULT_VISIBILITY_KEYWORD
}
if (visibilityModifier == defaultVisibilityKeyword) {
this.visibilityModifierType()?.let { removeModifier(it) }
return
}
addModifier(visibilityModifier)
return defaultVisibilityKeyword
}
fun KtSecondaryConstructor.getOrCreateBody(): KtBlockExpression {
+7
View File
@@ -1308,6 +1308,13 @@
cleanupTool="true"
level="WARNING"/>
<localInspection implementationClass="org.jetbrains.kotlin.idea.inspections.RedundantVisibilityModifierInspection"
displayName="Redundant visibility modifier"
groupName="Kotlin"
enabledByDefault="true"
cleanupTool="true"
level="WARNING"/>
<referenceImporter implementation="org.jetbrains.kotlin.idea.quickfix.KotlinReferenceImporter"/>
<fileType.fileViewProviderFactory filetype="KJSM" implementationClass="com.intellij.psi.ClassFileViewProviderFactory"/>
@@ -0,0 +1,51 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.inspections
import com.intellij.codeInspection.*
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElementVisitor
import org.jetbrains.kotlin.idea.core.implicitVisibility
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtVisitorVoid
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
class RedundantVisibilityModifierInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor {
return object : KtVisitorVoid() {
override fun visitDeclaration(dcl: KtDeclaration) {
val visibilityModifier = dcl.visibilityModifier() ?: return
if (visibilityModifier.node.elementType == dcl.implicitVisibility()) {
holder.registerProblem(visibilityModifier,
"Redundant visibility modifier",
ProblemHighlightType.LIKE_UNUSED_SYMBOL,
RemoveVisibilityModifierFix())
}
}
}
}
class RemoveVisibilityModifierFix : LocalQuickFix {
override fun getName(): String = "Remove redundant visibility modifier"
override fun getFamilyName(): String = getName()
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
descriptor.psiElement.delete()
}
}
}
@@ -0,0 +1,30 @@
<problems>
<problem>
<file>redundantVisibilityModifier.kt</file>
<line>1</line>
<entry_point TYPE="file" FQNAME="temp:///src/redundantVisibilityModifier.kt" />
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Redundant visibility modifier</problem_class>
<description>Redundant visibility modifier</description>
</problem>
<problem>
<file>redundantVisibilityModifier.kt</file>
<line>2</line>
<entry_point TYPE="file" FQNAME="temp:///src/redundantVisibilityModifier.kt" />
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Redundant visibility modifier</problem_class>
<description>Redundant visibility modifier</description>
</problem>
<problem>
<file>redundantVisibilityModifier.kt</file>
<line>4</line>
<entry_point TYPE="file" FQNAME="temp:///src/redundantVisibilityModifier.kt" />
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Redundant visibility modifier</problem_class>
<description>Redundant visibility modifier</description>
</problem>
<problem>
<file>redundantVisibilityModifier.kt</file>
<line>17</line>
<entry_point TYPE="file" FQNAME="temp:///src/redundantVisibilityModifier.kt" />
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Redundant visibility modifier</problem_class>
<description>Redundant visibility modifier</description>
</problem>
</problems>
@@ -0,0 +1 @@
// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.RedundantVisibilityModifierInspection
@@ -0,0 +1,22 @@
public class C {
public val foo: Int = 0
public fun bar() {}
}
open class D {
protected open fun willRemainProtected() {
}
protected open fun willBecomePublic() {
}
}
class E : D() {
protected override fun willRemainProtected() {
}
public override fun willBecomePublic() {
}
}
@@ -0,0 +1 @@
org.jetbrains.kotlin.idea.inspections.RedundantVisibilityModifierInspection
@@ -0,0 +1,3 @@
// "Remove redundant visibility modifier" "true"
<caret>public class C {
}
@@ -0,0 +1,3 @@
// "Remove redundant visibility modifier" "true"
class C {
}
@@ -118,6 +118,12 @@ public class InspectionTestGenerated extends AbstractInspectionTest {
doTest(fileName);
}
@TestMetadata("redundantVisibilityModifier/inspectionData/inspections.test")
public void testRedundantVisibilityModifier_inspectionData_Inspections_test() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/redundantVisibilityModifier/inspectionData/inspections.test");
doTest(fileName);
}
@TestMetadata("spelling/inspectionData/inspections.test")
public void testSpelling_inspectionData_Inspections_test() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/spelling/inspectionData/inspections.test");
@@ -5848,6 +5848,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
}
}
@TestMetadata("idea/testData/quickfix/redundantVisibilityModifier")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class RedundantVisibilityModifier extends AbstractQuickFixTest {
public void testAllFilesPresentInRedundantVisibilityModifier() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/redundantVisibilityModifier"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
}
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/redundantVisibilityModifier/simple.kt");
doTest(fileName);
}
}
@TestMetadata("idea/testData/quickfix/removeUnused")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)