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 631283cb3069..8adfc1411cd3 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 @@ -1182,8 +1182,8 @@ public final class ControlFlowUtil { @Nullable private static PsiElement getUnreachableExpressionParent(@Nullable PsiElement element) { if (element instanceof PsiExpression) { - final PsiElement expression = PsiTreeUtil.findFirstParent(element, e -> !(e.getParent() instanceof PsiParenthesizedExpression)); - if (expression != null) { + PsiElement expression = PsiTreeUtil.findFirstParent(element, e -> !(e.getParent() instanceof PsiParenthesizedExpression)); + while (expression != null) { final PsiElement parent = expression.getParent(); if (parent instanceof PsiExpressionStatement) { return getUnreachableStatementParent(parent); @@ -1194,6 +1194,11 @@ public final class ControlFlowUtil { parent instanceof PsiForeachStatement && ((PsiForeachStatement)parent).getIteratedValue() == expression) { return parent; } + if (parent instanceof PsiExpression) { + expression = parent; + } else { + break; + } } } return null; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/StatementWithExpression.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/StatementWithExpression.java index f1a11014a1fc..0fc66502dff5 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/StatementWithExpression.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/StatementWithExpression.java @@ -11,12 +11,43 @@ class WithCondition { } void testIf2(boolean b) { + return; + if (b == true) { + System.out.println("Never"); + } + else { + System.out.println("Never ever"); + } + } + + void testIf3(boolean b) { return; if ((b)) { System.out.println("Never"); } } + void testIf4() { + return; + if (Math.abs(1) > 2) { + System.out.println(); + } + } + + void testIf5() { + return; + if (new int[] {1,2,3}.length == 3) { + System.out.println(); + } + } + + void testIf6(boolean b, boolean c, boolean d) { + return; + if (b ? c : d) { + System.out.println(); + } + } + void testSwitch(int b) { return; switch (b) { @@ -25,6 +56,14 @@ class WithCondition { } } + void testSwitch2(int b) { + return; + switch (b+1) { + case 1: + System.out.println("Never"); + } + } + void testFor1(int b) { return; for (int i = 0; i < b; i++) { @@ -77,6 +116,13 @@ class WithCondition { } } + void testWhile2(boolean b) { + return; + while (!b) { + System.out.println("Never"); + } + } + void testDoWhile1(boolean b) { return; do System.out.println("Never"); @@ -90,4 +136,9 @@ class WithCondition { } while (b); } + + int testReturn() { + return 1; + return 2; + } } \ No newline at end of file