inspection and code cleanup for redundant visibility modifiers
This commit is contained in:
@@ -166,6 +166,17 @@ public fun KtClass.getOrCreateCompanionObject() : KtObjectDeclaration {
|
|||||||
|
|
||||||
//TODO: code style option whether to insert redundant 'public' keyword or not
|
//TODO: code style option whether to insert redundant 'public' keyword or not
|
||||||
public fun KtDeclaration.setVisibility(visibilityModifier: KtModifierKeywordToken) {
|
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)) {
|
val defaultVisibilityKeyword = if (hasModifier(KtTokens.OVERRIDE_KEYWORD)) {
|
||||||
(resolveToDescriptor() as? CallableMemberDescriptor)
|
(resolveToDescriptor() as? CallableMemberDescriptor)
|
||||||
?.overriddenDescriptors
|
?.overriddenDescriptors
|
||||||
@@ -175,13 +186,7 @@ public fun KtDeclaration.setVisibility(visibilityModifier: KtModifierKeywordToke
|
|||||||
else {
|
else {
|
||||||
KtTokens.DEFAULT_VISIBILITY_KEYWORD
|
KtTokens.DEFAULT_VISIBILITY_KEYWORD
|
||||||
}
|
}
|
||||||
|
return defaultVisibilityKeyword
|
||||||
if (visibilityModifier == defaultVisibilityKeyword) {
|
|
||||||
this.visibilityModifierType()?.let { removeModifier(it) }
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
addModifier(visibilityModifier)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KtSecondaryConstructor.getOrCreateBody(): KtBlockExpression {
|
fun KtSecondaryConstructor.getOrCreateBody(): KtBlockExpression {
|
||||||
|
|||||||
@@ -1308,6 +1308,13 @@
|
|||||||
cleanupTool="true"
|
cleanupTool="true"
|
||||||
level="WARNING"/>
|
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"/>
|
<referenceImporter implementation="org.jetbrains.kotlin.idea.quickfix.KotlinReferenceImporter"/>
|
||||||
|
|
||||||
<fileType.fileViewProviderFactory filetype="KJSM" implementationClass="com.intellij.psi.ClassFileViewProviderFactory"/>
|
<fileType.fileViewProviderFactory filetype="KJSM" implementationClass="com.intellij.psi.ClassFileViewProviderFactory"/>
|
||||||
|
|||||||
+51
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+30
@@ -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>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.RedundantVisibilityModifierInspection
|
||||||
+22
@@ -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);
|
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")
|
@TestMetadata("spelling/inspectionData/inspections.test")
|
||||||
public void testSpelling_inspectionData_Inspections_test() throws Exception {
|
public void testSpelling_inspectionData_Inspections_test() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/spelling/inspectionData/inspections.test");
|
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")
|
@TestMetadata("idea/testData/quickfix/removeUnused")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user