diff --git a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java index c22da9f943d1..cecb8c7231d5 100644 --- a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInspection.varScopeCanBeNarrowed; +import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.CodeInsightUtil; import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.codeInsight.daemon.ImplicitUsageProvider; @@ -23,13 +24,16 @@ import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.codeInspection.ex.BaseLocalInspectionTool; +import com.intellij.codeInspection.util.SpecialAnnotationsUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.JDOMExternalizableStringList; import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; @@ -42,9 +46,13 @@ import com.intellij.util.IJSwingUtilities; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashSet; import gnu.trove.THashSet; +import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import javax.swing.*; +import java.awt.*; import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; @@ -57,6 +65,7 @@ public class FieldCanBeLocalInspection extends BaseLocalInspectionTool { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.varScopeCanBeNarrowed.FieldCanBeLocalInspection"); @NonNls public static final String SHORT_NAME = "FieldCanBeLocal"; + public final JDOMExternalizableStringList EXCLUDE_ANNOS = new JDOMExternalizableStringList(); @NotNull public String getGroupDisplayName() { @@ -73,6 +82,24 @@ public class FieldCanBeLocalInspection extends BaseLocalInspectionTool { return SHORT_NAME; } + @Override + public void writeSettings(Element node) throws WriteExternalException { + if (!EXCLUDE_ANNOS.isEmpty()) { + super.writeSettings(node); + } + } + + @Nullable + @Override + public JComponent createOptionsPanel() { + final JPanel listPanel = SpecialAnnotationsUtil + .createSpecialAnnotationsListControl(EXCLUDE_ANNOS, InspectionsBundle.message("special.annotations.annotations.list")); + + final JPanel panel = new JPanel(new BorderLayout(2, 2)); + panel.add(listPanel, BorderLayout.NORTH); + return panel; + } + @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) { @@ -84,17 +111,20 @@ public class FieldCanBeLocalInspection extends BaseLocalInspectionTool { @Override public void visitJavaFile(PsiJavaFile file) { for (PsiClass aClass : file.getClasses()) { - docheckClass(aClass, holder); + docheckClass(aClass, holder, EXCLUDE_ANNOS); } } }; } - private static void docheckClass(final PsiClass aClass, ProblemsHolder holder) { + private static void docheckClass(final PsiClass aClass, ProblemsHolder holder, final List excludeAnnos) { if (aClass.isInterface()) return; final PsiField[] fields = aClass.getFields(); final Set candidates = new LinkedHashSet(); for (PsiField field : fields) { + if (AnnotationUtil.isAnnotated(field, excludeAnnos)) { + continue; + } if (field.hasModifierProperty(PsiModifier.PRIVATE) && !(field.hasModifierProperty(PsiModifier.STATIC) && field.hasModifierProperty(PsiModifier.FINAL))) { candidates.add(field); } diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/ignoreAnnotated/expected.xml b/java/java-tests/testData/inspection/fieldCanBeLocal/ignoreAnnotated/expected.xml new file mode 100644 index 000000000000..580a889dbfd6 --- /dev/null +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/ignoreAnnotated/expected.xml @@ -0,0 +1,3 @@ + + + diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/ignoreAnnotated/src/Test.java b/java/java-tests/testData/inspection/fieldCanBeLocal/ignoreAnnotated/src/Test.java new file mode 100644 index 000000000000..fca728fbeb13 --- /dev/null +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/ignoreAnnotated/src/Test.java @@ -0,0 +1,9 @@ +class Test { + @Deprecated + private int f; + + void foo () { + f = 0; + int k = f; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java index 5ebd2c2cf9f6..a4bcdf6e5276 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java @@ -30,4 +30,9 @@ public class FieldCanBeLocalTest extends InspectionTestCase { public void testLocalStateVar2InnerClass() throws Exception { doTest(); } public void testNotConstantInitializer() throws Exception {doTest();} public void testInnerClassFieldInitializer() throws Exception {doTest();} + public void testIgnoreAnnotated() throws Exception { + final FieldCanBeLocalInspection inspection = new FieldCanBeLocalInspection(); + inspection.EXCLUDE_ANNOS.add(Deprecated.class.getName()); + doTest("fieldCanBeLocal/" + getTestName(true), inspection); + } }