diff --git a/java/java-analysis-impl/resources/messages/InspectionGadgetsBundle.properties b/java/java-analysis-impl/resources/messages/InspectionGadgetsBundle.properties index 0e87dc06eebe..3f094eea31c9 100644 --- a/java/java-analysis-impl/resources/messages/InspectionGadgetsBundle.properties +++ b/java/java-analysis-impl/resources/messages/InspectionGadgetsBundle.properties @@ -1866,6 +1866,7 @@ unnecessary.final.report.local.variables.option=Report local variables unnecessary.final.report.pattern.variables.option=Report pattern variables unnecessary.final.report.method.parameters.option=Report method parameters unnecessary.final.report.foreach.parameters.option=Report foreach parameter +unnecessary.final.report.catch.parameters.option=Report catch parameters unnecessary.final.on.parameter.only.interface.option=Only warn on abstract or interface methods choose.exception.class=Choose Exception Class choose.exception.label=Prohibited exceptions: diff --git a/java/java-analysis-impl/src/com/siyeh/ig/style/UnnecessaryFinalOnLocalVariableOrParameterInspection.java b/java/java-analysis-impl/src/com/siyeh/ig/style/UnnecessaryFinalOnLocalVariableOrParameterInspection.java index 3b27e66008cf..11cd76aaa986 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/style/UnnecessaryFinalOnLocalVariableOrParameterInspection.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/style/UnnecessaryFinalOnLocalVariableOrParameterInspection.java @@ -46,6 +46,9 @@ public final class UnnecessaryFinalOnLocalVariableOrParameterInspection extends @SuppressWarnings("PublicField") public boolean reportParameters = true; + @SuppressWarnings("PublicField") + public boolean reportCatchParameters = true; + @SuppressWarnings("PublicField") public boolean reportForeachParameters = true; @@ -68,7 +71,8 @@ public final class UnnecessaryFinalOnLocalVariableOrParameterInspection extends checkbox("reportPatternVariables", InspectionGadgetsBundle.message("unnecessary.final.report.pattern.variables.option")), checkbox("reportParameters", InspectionGadgetsBundle.message("unnecessary.final.report.method.parameters.option"), checkbox("onlyWarnOnAbstractMethods", InspectionGadgetsBundle.message("unnecessary.final.on.parameter.only.interface.option"))), - checkbox("reportForeachParameters", InspectionGadgetsBundle.message("unnecessary.final.report.foreach.parameters.option")) + checkbox("reportForeachParameters", InspectionGadgetsBundle.message("unnecessary.final.report.foreach.parameters.option")), + checkbox("reportCatchParameters", InspectionGadgetsBundle.message("unnecessary.final.report.catch.parameters.option")) ); } @@ -159,7 +163,7 @@ public final class UnnecessaryFinalOnLocalVariableOrParameterInspection extends } } } - if (onlyWarnOnAbstractMethods || !reportParameters) { + if (onlyWarnOnAbstractMethods || !reportCatchParameters) { return; } final PsiCatchSection[] catchSections = statement.getCatchSections(); @@ -193,7 +197,8 @@ public final class UnnecessaryFinalOnLocalVariableOrParameterInspection extends private static boolean isNecessaryFinal(PsiVariable variable, PsiElement context) { return PsiUtil.isConstantExpression(variable.getInitializer()) || - !PsiUtil.isAvailable(JavaFeature.EFFECTIVELY_FINAL, variable) && VariableAccessUtils.variableIsUsedInInnerClass(variable, context); + !PsiUtil.isAvailable(JavaFeature.EFFECTIVELY_FINAL, variable) && + VariableAccessUtils.variableIsUsedInInnerClass(variable, context); } private void check(PsiParameter parameter) { diff --git a/java/java-tests/testSrc/com/siyeh/ig/style/UnnecessaryFinalOnLocalVariableOrParameterInspectionJava8Test.java b/java/java-tests/testSrc/com/siyeh/ig/style/UnnecessaryFinalOnLocalVariableOrParameterInspectionJava8Test.java index f9d371477bf9..55bd123ae92b 100644 --- a/java/java-tests/testSrc/com/siyeh/ig/style/UnnecessaryFinalOnLocalVariableOrParameterInspectionJava8Test.java +++ b/java/java-tests/testSrc/com/siyeh/ig/style/UnnecessaryFinalOnLocalVariableOrParameterInspectionJava8Test.java @@ -104,6 +104,45 @@ public class UnnecessaryFinalOnLocalVariableOrParameterInspectionJava8Test exten """); } + public void testCatchParametersDisabled() { + final UnnecessaryFinalOnLocalVariableOrParameterInspection inspection = new UnnecessaryFinalOnLocalVariableOrParameterInspection(); + inspection.reportCatchParameters = false; + myFixture.enableInspections(inspection); + doTest(""" + import java.io.*; + + class FinalTest { + public void foobar(/*Unnecessary 'final' on parameter 'boo'*/final/**/ String boo) { + try (/*Unnecessary 'final' on variable 'reader'*/final/**/ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + reader.readLine(); + } + catch (final IOException e) { + throw new RuntimeException(e); + } + } + } + """); + } + + public void testCatchParametersEnabled() { + final UnnecessaryFinalOnLocalVariableOrParameterInspection inspection = new UnnecessaryFinalOnLocalVariableOrParameterInspection(); + inspection.reportCatchParameters = true; + myFixture.enableInspections(inspection); + doTest(""" + import java.io.*; + + class FinalTest { + public void foobar(/*Unnecessary 'final' on parameter 'boo'*/final/**/ String boo) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + reader.readLine(); + } catch (/*Unnecessary 'final' on parameter 'e'*/final/**/ IOException e) { + throw new RuntimeException(e); + } + } + } + """); + } + @Nullable @Override protected InspectionProfileEntry getInspection() {