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); } }