diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
index 282d20c464f7..39406dc5b0f0 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
@@ -796,7 +796,7 @@ public class HighlightUtil extends HighlightUtilBase {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create();
}
}
- else if (expression != null && !plainRef) {
+ else if (expression != null && (!plainRef || ((PsiReferenceExpression)expression).resolve() instanceof PsiVariable)) {
String message = JavaErrorMessages.message("value.break.unexpected");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create();
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
index fde2bbef7bd0..7d5f0e3fc5cc 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
@@ -306,8 +306,15 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements
labels = new JavaResolveResult[]{new CandidateInfo(labeled, PsiSubstitutor.EMPTY)};
}
- PsiElement context = PsiImplUtil.findEnclosingSwitchOrLoop(breakStatement);
- if (!(context instanceof PsiSwitchExpression)) {
+ boolean insideSwitchExpression = false;
+ PsiElement context = breakStatement;
+ while ((context = PsiImplUtil.findEnclosingSwitchOrLoop(context.getParent())) != null) {
+ if (context instanceof PsiSwitchExpression) {
+ insideSwitchExpression = true;
+ break;
+ }
+ }
+ if (!insideSwitchExpression) {
return labels;
}
else if (labels.length > 0) {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/ValueBreaks.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/ValueBreaks.java
index 1afbb3aa2481..99c7068e9156 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/ValueBreaks.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/ValueBreaks.java
@@ -18,14 +18,30 @@ class ValueBreaks {
sink(switch (0) {
case 0 -> { while (true) break 42; }
- case 1 -> { while (true) break ref; }
+ case 1 -> { while (true) break ref; }
case 2 -> { while (true) break wtf; }
case 3 -> { break ref; }
case 4 -> { break (ref); }
case 5 -> { break wtf; }
+ case 6 -> {
+ int a = 0;
+ a: switch (0) {
+ default: break a;
+ }
+ }
default -> throw new RuntimeException();
});
+ switch (0) {
+ case 0 -> { while (true) break ref; }
+ case 1 -> {
+ int a = 0;
+ a: switch (0) {
+ default: break a;
+ }
+ }
+ }
+
ref: sink(switch (0) {
default: break ref;
});