From 75b0d351de3a2f471e81ffd9d1f33149378dffc8 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Thu, 11 Aug 2016 18:30:13 +0300 Subject: [PATCH] [groovy] unnecessary 'public' inspection --- .../GrUnnecessaryPublicModifier.html | 5 ++ ...GrUnnecessaryPublicModifierInspection.java | 61 +++++++++++++++++++ plugins/groovy/src/META-INF/plugin.xml | 3 + ...cessaryPublicModifierInspectionTest.groovy | 58 ++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 plugins/groovy/groovy-psi/resources/inspectionDescriptions/GrUnnecessaryPublicModifier.html create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryPublicModifierInspection.java create mode 100644 plugins/groovy/test/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryPublicModifierInspectionTest.groovy diff --git a/plugins/groovy/groovy-psi/resources/inspectionDescriptions/GrUnnecessaryPublicModifier.html b/plugins/groovy/groovy-psi/resources/inspectionDescriptions/GrUnnecessaryPublicModifier.html new file mode 100644 index 000000000000..41eb3532fcdf --- /dev/null +++ b/plugins/groovy/groovy-psi/resources/inspectionDescriptions/GrUnnecessaryPublicModifier.html @@ -0,0 +1,5 @@ + + +Reports unnecessary public modifiers. + + \ No newline at end of file diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryPublicModifierInspection.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryPublicModifierInspection.java new file mode 100644 index 000000000000..50794b28bfc1 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryPublicModifierInspection.java @@ -0,0 +1,61 @@ +/* + * Copyright 2000-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.plugins.groovy.codeInspection.style; + +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ProblemHighlightType; +import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.PsiModifier; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.codeInspection.GroovyInspectionBundle; +import org.jetbrains.plugins.groovy.codeInspection.GroovySuppressableInspectionTool; +import org.jetbrains.plugins.groovy.codeInspection.bugs.GrRemoveModifierFix; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; + +public class GrUnnecessaryPublicModifierInspection extends GroovySuppressableInspectionTool { + + private static final LocalQuickFix FIX = new GrRemoveModifierFix(PsiModifier.PUBLIC); + + @NotNull + @Override + public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + return new PsiElementVisitor() { + @Override + public void visitElement(PsiElement modifier) { + if (modifier.getNode().getElementType() != GroovyTokenTypes.kPUBLIC) return; + + PsiElement list = modifier.getParent(); + if (!(list instanceof GrModifierList)) return; + + PsiElement parent = list.getParent(); + // Do not mark public on fields as unnecessary + // It may be put there explicitly to prevent getter/setter generation. + if (parent instanceof GrVariableDeclaration) return; + + holder.registerProblem( + modifier, + GroovyInspectionBundle.message("unnecessary.modifier.description", PsiModifier.PUBLIC), + ProblemHighlightType.LIKE_UNUSED_SYMBOL, + FIX + ); + } + }; + } +} diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index bf3e6adc379b..2f2d61270cdb 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -826,6 +826,9 @@ + diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryPublicModifierInspectionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryPublicModifierInspectionTest.groovy new file mode 100644 index 000000000000..02d1f1bbd17b --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryPublicModifierInspectionTest.groovy @@ -0,0 +1,58 @@ +/* + * Copyright 2000-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.plugins.groovy.codeInspection.style + +import com.intellij.testFramework.LightProjectDescriptor +import groovy.transform.CompileStatic +import org.jetbrains.plugins.groovy.GroovyLightProjectDescriptor +import org.jetbrains.plugins.groovy.LightGroovyTestCase + +@CompileStatic +public class GrUnnecessaryPublicModifierInspectionTest extends LightGroovyTestCase { + + final LightProjectDescriptor projectDescriptor = GroovyLightProjectDescriptor.GROOVY_LATEST + + void 'test highlighting and fix'() { + fixture.with { + enableInspections GrUnnecessaryPublicModifierInspection + configureByText '_.groovy', '''\ +public class A { + public A() {} + public foo() {} + public x + public class B {} +} +public enum E {} +public interface I {} +''' + checkHighlighting() + launchAction findSingleIntention("Fix all 'Unnecessary 'public''") + checkResult '''\ +class A { + A() {} + def foo() {} + public x + class B {} +} +enum E {} +interface I {} +''' + } + } +} \ No newline at end of file