Skip to content

Commit e47e9f6

Browse files
committed
inspection and code cleanup for redundant visibility modifiers
1 parent b736880 commit e47e9f6

File tree

11 files changed

+151
-7
lines changed

11 files changed

+151
-7
lines changed

idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@ public fun KtClass.getOrCreateCompanionObject() : KtObjectDeclaration {
166166

167167
//TODO: code style option whether to insert redundant 'public' keyword or not
168168
public fun KtDeclaration.setVisibility(visibilityModifier: KtModifierKeywordToken) {
169+
val defaultVisibilityKeyword = implicitVisibility()
170+
171+
if (visibilityModifier == defaultVisibilityKeyword) {
172+
this.visibilityModifierType()?.let { removeModifier(it) }
173+
return
174+
}
175+
176+
addModifier(visibilityModifier)
177+
}
178+
179+
fun KtDeclaration.implicitVisibility(): KtModifierKeywordToken? {
169180
val defaultVisibilityKeyword = if (hasModifier(KtTokens.OVERRIDE_KEYWORD)) {
170181
(resolveToDescriptor() as? CallableMemberDescriptor)
171182
?.overriddenDescriptors
@@ -175,13 +186,7 @@ public fun KtDeclaration.setVisibility(visibilityModifier: KtModifierKeywordToke
175186
else {
176187
KtTokens.DEFAULT_VISIBILITY_KEYWORD
177188
}
178-
179-
if (visibilityModifier == defaultVisibilityKeyword) {
180-
this.visibilityModifierType()?.let { removeModifier(it) }
181-
return
182-
}
183-
184-
addModifier(visibilityModifier)
189+
return defaultVisibilityKeyword
185190
}
186191

187192
fun KtSecondaryConstructor.getOrCreateBody(): KtBlockExpression {

idea/src/META-INF/plugin.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,13 @@
13081308
cleanupTool="true"
13091309
level="WARNING"/>
13101310

1311+
<localInspection implementationClass="org.jetbrains.kotlin.idea.inspections.RedundantVisibilityModifierInspection"
1312+
displayName="Redundant visibility modifier"
1313+
groupName="Kotlin"
1314+
enabledByDefault="true"
1315+
cleanupTool="true"
1316+
level="WARNING"/>
1317+
13111318
<referenceImporter implementation="org.jetbrains.kotlin.idea.quickfix.KotlinReferenceImporter"/>
13121319

13131320
<fileType.fileViewProviderFactory filetype="KJSM" implementationClass="com.intellij.psi.ClassFileViewProviderFactory"/>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright 2010-2016 JetBrains s.r.o.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.jetbrains.kotlin.idea.inspections
18+
19+
import com.intellij.codeInspection.*
20+
import com.intellij.openapi.project.Project
21+
import com.intellij.psi.PsiElementVisitor
22+
import org.jetbrains.kotlin.idea.core.implicitVisibility
23+
import org.jetbrains.kotlin.psi.KtDeclaration
24+
import org.jetbrains.kotlin.psi.KtVisitorVoid
25+
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
26+
27+
class RedundantVisibilityModifierInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool {
28+
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor {
29+
return object : KtVisitorVoid() {
30+
override fun visitDeclaration(dcl: KtDeclaration) {
31+
val visibilityModifier = dcl.visibilityModifier() ?: return
32+
if (visibilityModifier.node.elementType == dcl.implicitVisibility()) {
33+
holder.registerProblem(visibilityModifier,
34+
"Redundant visibility modifier",
35+
ProblemHighlightType.LIKE_UNUSED_SYMBOL,
36+
RemoveVisibilityModifierFix())
37+
}
38+
}
39+
}
40+
}
41+
42+
class RemoveVisibilityModifierFix : LocalQuickFix {
43+
override fun getName(): String = "Remove redundant visibility modifier"
44+
45+
override fun getFamilyName(): String = getName()
46+
47+
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
48+
descriptor.psiElement.delete()
49+
}
50+
}
51+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<problems>
2+
<problem>
3+
<file>redundantVisibilityModifier.kt</file>
4+
<line>1</line>
5+
<entry_point TYPE="file" FQNAME="temp:///src/redundantVisibilityModifier.kt" />
6+
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Redundant visibility modifier</problem_class>
7+
<description>Redundant visibility modifier</description>
8+
</problem>
9+
<problem>
10+
<file>redundantVisibilityModifier.kt</file>
11+
<line>2</line>
12+
<entry_point TYPE="file" FQNAME="temp:///src/redundantVisibilityModifier.kt" />
13+
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Redundant visibility modifier</problem_class>
14+
<description>Redundant visibility modifier</description>
15+
</problem>
16+
<problem>
17+
<file>redundantVisibilityModifier.kt</file>
18+
<line>4</line>
19+
<entry_point TYPE="file" FQNAME="temp:///src/redundantVisibilityModifier.kt" />
20+
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Redundant visibility modifier</problem_class>
21+
<description>Redundant visibility modifier</description>
22+
</problem>
23+
<problem>
24+
<file>redundantVisibilityModifier.kt</file>
25+
<line>17</line>
26+
<entry_point TYPE="file" FQNAME="temp:///src/redundantVisibilityModifier.kt" />
27+
<problem_class severity="WARNING" attribute_key="NOT_USED_ELEMENT_ATTRIBUTES">Redundant visibility modifier</problem_class>
28+
<description>Redundant visibility modifier</description>
29+
</problem>
30+
</problems>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.RedundantVisibilityModifierInspection
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
public class C {
2+
public val foo: Int = 0
3+
4+
public fun bar() {}
5+
6+
}
7+
8+
open class D {
9+
protected open fun willRemainProtected() {
10+
}
11+
12+
protected open fun willBecomePublic() {
13+
}
14+
}
15+
16+
class E : D() {
17+
protected override fun willRemainProtected() {
18+
}
19+
20+
public override fun willBecomePublic() {
21+
}
22+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.jetbrains.kotlin.idea.inspections.RedundantVisibilityModifierInspection
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// "Remove redundant visibility modifier" "true"
2+
<caret>public class C {
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// "Remove redundant visibility modifier" "true"
2+
class C {
3+
}

idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ public void testRedundantSamConstructor_inspectionData_Inspections_test() throws
118118
doTest(fileName);
119119
}
120120

121+
@TestMetadata("redundantVisibilityModifier/inspectionData/inspections.test")
122+
public void testRedundantVisibilityModifier_inspectionData_Inspections_test() throws Exception {
123+
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/redundantVisibilityModifier/inspectionData/inspections.test");
124+
doTest(fileName);
125+
}
126+
121127
@TestMetadata("spelling/inspectionData/inspections.test")
122128
public void testSpelling_inspectionData_Inspections_test() throws Exception {
123129
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/spelling/inspectionData/inspections.test");

idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5848,6 +5848,21 @@ public void testInsertGetterBeforeExistingSetter() throws Exception {
58485848
}
58495849
}
58505850

5851+
@TestMetadata("idea/testData/quickfix/redundantVisibilityModifier")
5852+
@TestDataPath("$PROJECT_ROOT")
5853+
@RunWith(JUnit3RunnerWithInners.class)
5854+
public static class RedundantVisibilityModifier extends AbstractQuickFixTest {
5855+
public void testAllFilesPresentInRedundantVisibilityModifier() throws Exception {
5856+
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/redundantVisibilityModifier"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
5857+
}
5858+
5859+
@TestMetadata("simple.kt")
5860+
public void testSimple() throws Exception {
5861+
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/redundantVisibilityModifier/simple.kt");
5862+
doTest(fileName);
5863+
}
5864+
}
5865+
58515866
@TestMetadata("idea/testData/quickfix/removeUnused")
58525867
@TestDataPath("$PROJECT_ROOT")
58535868
@RunWith(JUnit3RunnerWithInners.class)

0 commit comments

Comments
 (0)