From c8f3d1e20c3bd84dd62ff457bca888a59313af93 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 8 Feb 2018 13:29:49 +0700 Subject: [PATCH] ControlFlowUtil#isVariableAssignedInLoop: evaluate constant conditions Fixes IDEA-186306 good code red: variable might be assigned in loop --- .../psi/controlFlow/ControlFlowUtil.java | 2 +- .../advHighlighting/AssignToFinal.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java index 187db633d80b..d49f779aa9d5 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java @@ -2158,7 +2158,7 @@ public class ControlFlowUtil { if (codeBlock == null) return false; final ControlFlow flow; try { - flow = ControlFlowFactory.getInstance(codeBlock.getProject()).getControlFlow(codeBlock, LocalsOrMyInstanceFieldsControlFlowPolicy.getInstance(), false); + flow = ControlFlowFactory.getInstance(codeBlock.getProject()).getControlFlow(codeBlock, LocalsOrMyInstanceFieldsControlFlowPolicy.getInstance(), true); } catch (AnalysisCanceledException e) { return false; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java index 545470cb5dcb..a9d6d0f91d65 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java @@ -111,4 +111,23 @@ class T3a { b = true; // red System.out.println(b); } +} +class T29 { + // IDEA-186306 + private final int j; + T29 (int b) { + do { + j = 34; // guaranteed to only be executed once + if (true) break; + } while (b == 1); + } +} +class T29a { + private final int j; + T29a (int b) { + do { + j = 34; // not guaranteed by JLS to only be executed once + if (j > 0) break; + } while (b == 1); + } } \ No newline at end of file