From a0a5570958cf29dd1905ad4e37cd0ab353504071 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sat, 26 Oct 2013 21:05:13 +0200 Subject: [PATCH] IDEA-115452 ("Local variable or parameter can be final" -- "Report local variables" setting doesn't work) --- .../localCanBeFinal/LocalCanBeFinal.java | 22 ++++++++++++------- .../ForeachNotReported/expected.xml | 9 ++++++++ .../src/ForeachNotReported.java | 8 +++++++ .../codeInspection/LocalCanBeFinalTest.java | 6 +++++ 4 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/inspection/localCanBeFinal/ForeachNotReported/expected.xml create mode 100644 java/java-tests/testData/inspection/localCanBeFinal/ForeachNotReported/src/ForeachNotReported.java 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 8a2498d43874..25a30416e855 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 @@ -224,8 +224,8 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { } for (PsiVariable variable : result) { - final PsiIdentifier nameIdenitier = variable.getNameIdentifier(); - PsiElement problemElement = nameIdenitier != null ? nameIdenitier : variable; + final PsiIdentifier nameIdentifier = variable.getNameIdentifier(); + PsiElement problemElement = nameIdentifier != null ? nameIdentifier : variable; if (variable instanceof PsiParameter && !(((PsiParameter)variable).getDeclarationScope() instanceof PsiForeachStatement)) { problems.add(manager.createProblemDescriptor(problemElement, InspectionsBundle.message("inspection.can.be.local.parameter.problem.descriptor"), @@ -243,13 +243,19 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { private boolean shouldBeIgnored(PsiVariable psiVariable) { if (psiVariable.hasModifierProperty(PsiModifier.FINAL)) return true; - if (!isReportParameters()) { - if (psiVariable instanceof PsiParameter) { - final PsiElement declarationScope = ((PsiParameter)psiVariable).getDeclarationScope(); - if (declarationScope instanceof PsiMethod || declarationScope instanceof PsiLambdaExpression) return true; - } + return isLocalVariable(psiVariable) ? !isReportVariables() : !isReportParameters(); + } + + private static boolean isLocalVariable(PsiVariable variable) { + if (variable instanceof PsiLocalVariable) { + return true; } - return !isReportVariables() && psiVariable instanceof PsiLocalVariable; + if (!(variable instanceof PsiParameter)) { + return false; + } + final PsiParameter parameter = (PsiParameter)variable; + final PsiElement declarationScope = parameter.getDeclarationScope(); + return !(declarationScope instanceof PsiMethod) && !(declarationScope instanceof PsiLambdaExpression); } @Override diff --git a/java/java-tests/testData/inspection/localCanBeFinal/ForeachNotReported/expected.xml b/java/java-tests/testData/inspection/localCanBeFinal/ForeachNotReported/expected.xml new file mode 100644 index 000000000000..baecff6541b3 --- /dev/null +++ b/java/java-tests/testData/inspection/localCanBeFinal/ForeachNotReported/expected.xml @@ -0,0 +1,9 @@ + + + + ForeachNotReported.java + 5 + Local variable or parameter can be final + Parameter <code>list</code> can have <code>final</code> modifier + + \ No newline at end of file diff --git a/java/java-tests/testData/inspection/localCanBeFinal/ForeachNotReported/src/ForeachNotReported.java b/java/java-tests/testData/inspection/localCanBeFinal/ForeachNotReported/src/ForeachNotReported.java new file mode 100644 index 000000000000..95880d51720a --- /dev/null +++ b/java/java-tests/testData/inspection/localCanBeFinal/ForeachNotReported/src/ForeachNotReported.java @@ -0,0 +1,8 @@ +import java.util.*; + +class ForeachNotReported { + + void f(List list) { + for (String s : list) {} + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/LocalCanBeFinalTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/LocalCanBeFinalTest.java index 7dfa608fc142..210891787f12 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/LocalCanBeFinalTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/LocalCanBeFinalTest.java @@ -123,4 +123,10 @@ public class LocalCanBeFinalTest extends InspectionTestCase { myTool.REPORT_VARIABLES = true; doTest(); } + + public void testForeachNotReported() throws Exception { + myTool.REPORT_PARAMETERS = true; + myTool.REPORT_VARIABLES = false; + doTest(); + } }