diff --git a/java/java-impl/src/com/intellij/codeInsight/highlighting/HighlightBreakOutsHandler.java b/java/java-impl/src/com/intellij/codeInsight/highlighting/HighlightBreakOutsHandler.java index 4e783b95be8e..18bd5c8c4635 100644 --- a/java/java-impl/src/com/intellij/codeInsight/highlighting/HighlightBreakOutsHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/highlighting/HighlightBreakOutsHandler.java @@ -3,8 +3,12 @@ package com.intellij.codeInsight.highlighting; import com.intellij.openapi.editor.Editor; import com.intellij.psi.*; +import com.intellij.psi.controlFlow.*; import com.intellij.util.Consumer; +import com.intellij.util.containers.IntArrayList; +import org.jetbrains.annotations.NotNull; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -33,20 +37,46 @@ public class HighlightBreakOutsHandler extends HighlightUsagesHandlerBase statements = ControlFlowUtil + .findExitPointsAndStatements(controlFlow, 0, controlFlow.getSize(), new IntArrayList(), ControlFlowUtil.DEFAULT_EXIT_STATEMENTS_CLASSES); + for (PsiStatement psiStatement: statements) { + if (currentStatement == psiStatement) continue; + if (psiStatement instanceof PsiContinueStatement && ((PsiContinueStatement)psiStatement).findContinuedStatement() == container || + psiStatement instanceof PsiBreakStatement && ((PsiBreakStatement)psiStatement).findExitedStatement() == container) { + addOccurrence(psiStatement.getFirstChild()); + } + } + } + catch (AnalysisCanceledException ignored) { } + } + private void highlightLoopDeclaration(PsiLoopStatement statement) { if (statement instanceof PsiDoWhileStatement) { diff --git a/java/java-tests/testData/codeInsight/highlightUsagesHandler/BreakInDoWhile.java b/java/java-tests/testData/codeInsight/highlightUsagesHandler/BreakInDoWhile.java index 7a66a01951f9..ad22bd69598b 100644 --- a/java/java-tests/testData/codeInsight/highlightUsagesHandler/BreakInDoWhile.java +++ b/java/java-tests/testData/codeInsight/highlightUsagesHandler/BreakInDoWhile.java @@ -1,7 +1,13 @@ class Main { public static void main(String[] args) { - do { - if (true) break; - } while (args != null); + lbl: + while (true) { + int i = 0; + do { + if (i++ > 7) break; + if (i % 2 == 0) continue; + if (--i > 8) continue lbl; + } while (args != null); + } } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/highlighting/HighlightUsagesHandlerTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/highlighting/HighlightUsagesHandlerTest.groovy index 817a57c88833..a22374b8a9b9 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/highlighting/HighlightUsagesHandlerTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/highlighting/HighlightUsagesHandlerTest.groovy @@ -108,7 +108,7 @@ class HighlightUsagesHandlerTest extends LightCodeInsightFixtureTestCase { void testBreakInDoWhile() { configureFile() ctrlShiftF7() - assertRangeText 'break', 'while' + assertRangeText 'break', 'continue', 'while' checkUnselect() }