From e1eab582734154eb624fc7e4f661d2fbdd3555ef Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 22 Nov 2013 15:53:17 +0100 Subject: [PATCH] IDEA-116071 (Field can be final inspection change) --- .../localCanBeFinal/LocalCanBeFinal.java | 86 ++++++------------- .../codeInspection/LocalCanBeFinalTest.java | 2 + .../src/messages/InspectionsBundle.properties | 2 + 3 files changed, 29 insertions(+), 61 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java b/java/java-analysis-impl/src/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java index 8253db051060..d4cff693643a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java @@ -18,6 +18,7 @@ package com.intellij.codeInspection.localCanBeFinal; import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.codeInspection.*; +import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -44,6 +45,8 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { public boolean REPORT_VARIABLES = true; public boolean REPORT_PARAMETERS = true; + public boolean REPORT_CATCH_PARAMETERS = true; + public boolean REPORT_FOREACH_PARAMETERS = true; private final LocalQuickFix myQuickFix; @NonNls public static final String SHORT_NAME = "LocalCanBeFinal"; @@ -148,6 +151,7 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { @Override public void visitCatchSection(PsiCatchSection section) { super.visitCatchSection(section); + if (!REPORT_CATCH_PARAMETERS) return; final PsiParameter parameter = section.getParameter(); if (PsiTreeUtil.getParentOfType(parameter, PsiClass.class) != PsiTreeUtil.getParentOfType(body, PsiClass.class)) { return; @@ -164,6 +168,7 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { @Override public void visitForeachStatement(PsiForeachStatement statement) { super.visitForeachStatement(statement); + if (!REPORT_FOREACH_PARAMETERS) return; final PsiParameter param = statement.getIterationParameter(); if (PsiTreeUtil.getParentOfType(param, PsiClass.class) != PsiTreeUtil.getParentOfType(body, PsiClass.class)) { return; @@ -219,7 +224,7 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { } }); - if (body.getParent() instanceof PsiMethod && isReportParameters()) { + if (body.getParent() instanceof PsiMethod && REPORT_PARAMETERS) { final PsiMethod method = (PsiMethod)body.getParent(); if (!(method instanceof SyntheticElement)) { // e.g. JspHolderMethod Collections.addAll(result, method.getParameterList().getParameters()); @@ -271,19 +276,21 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { private boolean shouldBeIgnored(PsiVariable psiVariable) { if (psiVariable.hasModifierProperty(PsiModifier.FINAL)) return true; - return isLocalVariable(psiVariable) ? !isReportVariables() : !isReportParameters(); - } - - private static boolean isLocalVariable(PsiVariable variable) { - if (variable instanceof PsiLocalVariable) { - return true; + if (psiVariable instanceof PsiLocalVariable) { + return !REPORT_VARIABLES; } - if (!(variable instanceof PsiParameter)) { - return false; + if (psiVariable instanceof PsiParameter) { + final PsiParameter parameter = (PsiParameter)psiVariable; + final PsiElement declarationScope = parameter.getDeclarationScope(); + if (declarationScope instanceof PsiCatchSection) { + return !REPORT_CATCH_PARAMETERS; + } + else if (declarationScope instanceof PsiForeachStatement) { + return !REPORT_FOREACH_PARAMETERS; + } + return !REPORT_PARAMETERS; } - final PsiParameter parameter = (PsiParameter)variable; - final PsiElement declarationScope = parameter.getDeclarationScope(); - return !(declarationScope instanceof PsiMethod) && !(declarationScope instanceof PsiLambdaExpression); + return true; } @Override @@ -336,55 +343,12 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { @Override public JComponent createOptionsPanel() { - return new OptionsPanel(); - } - - private boolean isReportVariables() { - return REPORT_VARIABLES; - } - - private boolean isReportParameters() { - return REPORT_PARAMETERS; - } - - private class OptionsPanel extends JPanel { - private final JCheckBox myReportVariablesCheckbox; - private final JCheckBox myReportParametersCheckbox; - - private OptionsPanel() { - super(new GridBagLayout()); - - GridBagConstraints gc = new GridBagConstraints(); - gc.weighty = 0; - gc.weightx = 1; - gc.fill = GridBagConstraints.HORIZONTAL; - gc.anchor = GridBagConstraints.NORTHWEST; - - - myReportVariablesCheckbox = new JCheckBox(InspectionsBundle.message("inspection.local.can.be.final.option")); - myReportVariablesCheckbox.setSelected(REPORT_VARIABLES); - myReportVariablesCheckbox.getModel().addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - REPORT_VARIABLES = myReportVariablesCheckbox.isSelected(); - } - }); - gc.gridy = 0; - add(myReportVariablesCheckbox, gc); - - myReportParametersCheckbox = new JCheckBox(InspectionsBundle.message("inspection.local.can.be.final.option1")); - myReportParametersCheckbox.setSelected(REPORT_PARAMETERS); - myReportParametersCheckbox.getModel().addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - REPORT_PARAMETERS = myReportParametersCheckbox.isSelected(); - } - }); - - gc.weighty = 1; - gc.gridy++; - add(myReportParametersCheckbox, gc); - } + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionsBundle.message("inspection.local.can.be.final.option"), "REPORT_VARIABLES"); + panel.addCheckbox(InspectionsBundle.message("inspection.local.can.be.final.option1"), "REPORT_PARAMETERS"); + panel.addCheckbox(InspectionsBundle.message("inspection.local.can.be.final.option2"), "REPORT_CATCH_PARAMETERS"); + panel.addCheckbox(InspectionsBundle.message("inspection.local.can.be.final.option3"), "REPORT_FOREACH_PARAMETERS"); + return panel; } @Override diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/LocalCanBeFinalTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/LocalCanBeFinalTest.java index e29b65c31bcc..61895f6cb132 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/LocalCanBeFinalTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/LocalCanBeFinalTest.java @@ -127,12 +127,14 @@ public class LocalCanBeFinalTest extends InspectionTestCase { public void testForeachNotReported() throws Exception { myTool.REPORT_PARAMETERS = true; myTool.REPORT_VARIABLES = false; + myTool.REPORT_FOREACH_PARAMETERS = false; doTest(); } public void testNestedForeach() throws Exception { myTool.REPORT_PARAMETERS = false; myTool.REPORT_VARIABLES = true; + myTool.REPORT_FOREACH_PARAMETERS = true; doTest(); } diff --git a/platform/platform-resources-en/src/messages/InspectionsBundle.properties b/platform/platform-resources-en/src/messages/InspectionsBundle.properties index 1387caba4afb..0665e5c4ed89 100644 --- a/platform/platform-resources-en/src/messages/InspectionsBundle.properties +++ b/platform/platform-resources-en/src/messages/InspectionsBundle.properties @@ -123,6 +123,8 @@ inspection.1.7.problem.descriptor=Usage of generified after 1.6 API which would inspection.local.can.be.final.display.name=Local variable or parameter can be final inspection.local.can.be.final.option=Report local variables inspection.local.can.be.final.option1=Report method parameters +inspection.local.can.be.final.option2=Report catch parameters +inspection.local.can.be.final.option3=Report foreach parameters inspection.can.be.local.parameter.problem.descriptor=Parameter #ref can have final modifier inspection.can.be.local.variable.problem.descriptor=Variable #ref can have final modifier