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