diff --git a/java/java-impl/src/com/intellij/codeInspection/canBeFinal/CanBeFinalAnnotator.java b/java/java-impl/src/com/intellij/codeInspection/canBeFinal/CanBeFinalAnnotator.java index 56c4d9fab4fd..72a704c0181e 100644 --- a/java/java-impl/src/com/intellij/codeInspection/canBeFinal/CanBeFinalAnnotator.java +++ b/java/java-impl/src/com/intellij/codeInspection/canBeFinal/CanBeFinalAnnotator.java @@ -133,7 +133,8 @@ class CanBeFinalAnnotator extends RefGraphAnnotatorEx { catch (AnalysisCanceledException e) { flow = ControlFlow.EMPTY; } - Collection writtenVariables = ControlFlowUtil.getWrittenVariables(flow, 0, flow.getSize(), false); + Collection writtenVariables = new ArrayList(); + ControlFlowUtil.getWrittenVariables(flow, 0, flow.getSize(), false, writtenVariables); for (PsiVariable psiVariable : writtenVariables) { if (allFields.contains(psiVariable)) { if (instanceInitializerInitializedFields.contains(psiVariable)) { diff --git a/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java b/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java index 480d1216ae3e..82eb801c2e20 100644 --- a/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java +++ b/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java @@ -187,7 +187,16 @@ public class ControlFlowUtil { } public static Collection getWrittenVariables(ControlFlow flow, int start, int end, final boolean ignoreNotReachingWrites) { - Set set = new HashSet(); + final HashSet set = new HashSet(); + getWrittenVariables(flow, start, end, ignoreNotReachingWrites, set); + return set; + } + + public static void getWrittenVariables(ControlFlow flow, + int start, + int end, + final boolean ignoreNotReachingWrites, + final Collection set) { List instructions = flow.getInstructions(); for (int i = start; i < end; i++) { Instruction instruction = instructions.get(i); @@ -195,7 +204,6 @@ public class ControlFlowUtil { set.add(((WriteVariableInstruction)instruction).variable); } } - return set; } public static List getUsedVariables(ControlFlow flow, int start, int end) { diff --git a/java/java-tests/testData/inspection/canBeFinal/fieldAssignmentsInInitializer/expected.xml b/java/java-tests/testData/inspection/canBeFinal/fieldAssignmentsInInitializer/expected.xml new file mode 100644 index 000000000000..d704d58ed391 --- /dev/null +++ b/java/java-tests/testData/inspection/canBeFinal/fieldAssignmentsInInitializer/expected.xml @@ -0,0 +1,4 @@ + + + + diff --git a/java/java-tests/testData/inspection/canBeFinal/fieldAssignmentsInInitializer/src/Foo.java b/java/java-tests/testData/inspection/canBeFinal/fieldAssignmentsInInitializer/src/Foo.java new file mode 100644 index 000000000000..378086615efa --- /dev/null +++ b/java/java-tests/testData/inspection/canBeFinal/fieldAssignmentsInInitializer/src/Foo.java @@ -0,0 +1,7 @@ +final class Foo { + static boolean flag; + static { + flag = true; + flag = false; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/CanBeFinalTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/CanBeFinalTest.java index 6ca2c22e02cb..3732caaef7d0 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/CanBeFinalTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/CanBeFinalTest.java @@ -74,6 +74,10 @@ public class CanBeFinalTest extends InspectionTestCase { doTest(); } + public void testFieldAssignmentsInInitializer() throws Exception { + doTest(); + } + public void testSCR7737() throws Exception { CanBeFinalInspection tool = new CanBeFinalInspection(); tool.REPORT_CLASSES = false;