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