diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java
index 7ada545eae81..71b13ea68419 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java
@@ -95,7 +95,8 @@ public class HighlightControlFlowUtil {
// do not compute constant expressions for if() statement condition
// see JLS 14.20 Unreachable Statements
try {
- final ControlFlow controlFlow = getControlFlowNoConstantEvaluate(codeBlock);
+ AllVariablesControlFlowPolicy policy = AllVariablesControlFlowPolicy.getInstance();
+ final ControlFlow controlFlow = ControlFlowFactory.getInstance(codeBlock.getProject()).getControlFlow(codeBlock, policy, false, false);
final PsiElement unreachableStatement = ControlFlowUtil.getUnreachableStatement(controlFlow);
if (unreachableStatement != null) {
String description = JavaErrorMessages.message("unreachable.statement");
diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java
index 1f8284924151..2b566b18b45f 100644
--- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java
+++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java
@@ -1301,29 +1301,39 @@ class ControlFlowAnalyzer extends JavaElementVisitor {
if (rExpr != null) {
rExpr.accept(this);
}
- final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)lExpr;
- PsiExpression qualifierExpression = referenceExpression.getQualifierExpression();
- PsiVariable variable = getUsedVariable(referenceExpression);
- if (qualifierExpression == null ||
- qualifierExpression instanceof PsiThisExpression ||
- variable instanceof PsiField && variable.hasModifierProperty(PsiModifier.STATIC)) {
- if (variable != null) {
- if (myAssignmentTargetsAreElements) {
- startElement(lExpr);
- }
-
- if (expression.getOperationTokenType() != JavaTokenType.EQ) {
- generateReadInstruction(variable);
- }
- generateWriteInstruction(variable);
-
- if (myAssignmentTargetsAreElements) finishElement(lExpr);
+ PsiVariable variable = getUsedVariable((PsiReferenceExpression)lExpr);
+ if (variable != null) {
+ if (myAssignmentTargetsAreElements) {
+ startElement(lExpr);
}
+
+ if (expression.getOperationTokenType() != JavaTokenType.EQ) {
+ generateReadInstruction(variable);
+ }
+ generateWriteInstruction(variable);
+
+ if (myAssignmentTargetsAreElements) finishElement(lExpr);
}
else {
lExpr.accept(this); //?
}
}
+ else if (lExpr instanceof PsiArrayAccessExpression &&
+ ((PsiArrayAccessExpression)lExpr).getArrayExpression() instanceof PsiReferenceExpression){
+ PsiVariable variable = getUsedVariable((PsiReferenceExpression)((PsiArrayAccessExpression)lExpr).getArrayExpression());
+ if (variable != null) {
+ generateReadInstruction(variable);
+ final PsiExpression indexExpression = ((PsiArrayAccessExpression)lExpr).getIndexExpression();
+ if (indexExpression != null) {
+ indexExpression.accept(this);
+ }
+ } else {
+ lExpr.accept(this);
+ }
+ if (rExpr != null) {
+ rExpr.accept(this);
+ }
+ }
else if (lExpr != null) {
lExpr.accept(this);
if (rExpr != null) {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnreachableAssignments.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnreachableAssignments.java
new file mode 100644
index 000000000000..bd7ebff077a8
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnreachableAssignments.java
@@ -0,0 +1,31 @@
+class Test {
+ String[] days = {"",""};
+
+ public static void foo1() {
+ for (; ; ) {
+ break;
+ new Test().days = null;
+ }
+ }
+
+ void bar1() {
+ for (; ; ) {
+ break;
+ days = null;
+ }
+ }
+
+ static void foo2() {
+ for (; ; ) {
+ break;
+ new Test().days[0] = null;
+ }
+ }
+
+ void bar2() {
+ for (;;) {
+ break;
+ days[0] = null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java b/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java
index aa7c17cf6fb1..c86745b47f9a 100644
--- a/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java
+++ b/java/java-tests/testData/refactoring/inlineLocal/ArrayMethodCallInitialized.java
@@ -1,8 +1,8 @@
public class A {
public void testInlineRefactoring() {
- int[] array = ar();
- array[1] = 22;
+ int[] array = ar();
+ array[1] = 22;
}
private int[] ar() {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
index b699cf9167ec..17c0e5d13d93 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
@@ -58,4 +58,5 @@ public class LightAdvHighlightingJdk6Test extends LightDaemonAnalyzerTestCase {
public void testGenericArrayCreationWithGenericTypeWithOneUnboundedWildcardOneNormalParams() { doTest(false, false); }
public void testAgentPremain() { doTest(false, false); }
public void testInitializedBeforeUsed() { doTest(false, false); }
+ public void testUnreachableAssignments() { doTest(false, false); }
}