From b23c6b026b810e585ec1f8f264ebbcd68f2d01b4 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 4 Sep 2017 11:59:25 +0300 Subject: [PATCH] can complete normally: break inside switch (IDEA-178304) break inside switch when switch is selected should not lead to abnormal completion --- .../psi/controlFlow/ControlFlowAnalyzer.java | 2 +- .../intellij/psi/controlFlow/ControlFlowUtil.java | 13 +++++++++++-- .../VoidValueCompatibilityWithBreakInSwitch.java | 13 +++++++++++++ .../daemon/lambda/NewLambdaHighlightingTest.java | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/VoidValueCompatibilityWithBreakInSwitch.java diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java index 6e8d1e8f1eba..e4d85bba4730 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java @@ -885,7 +885,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor { if (((PsiSwitchLabelStatement)aStatement).isDefaultCase()) { defaultLabel = (PsiSwitchLabelStatement)aStatement; } - Instruction instruction = new ConditionalGoToInstruction(0, statement.getExpression()); + Instruction instruction = new ConditionalGoToInstruction(0, expr); myCurrentFlow.addInstruction(instruction); addElementOffsetLater(aStatement, true); } 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 576f231b4a1d..a0593d72ae7d 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 @@ -1044,8 +1044,17 @@ public class ControlFlowUtil { boolean isNormal = nextOffset <= endOffset && !isReturn && (nextOffset == endOffset || canCompleteNormally[nextOffset]); if (isNormal && nextOffset == endOffset) { PsiElement element = flow.getElement(offset); - if (element instanceof PsiBreakStatement || element instanceof PsiContinueStatement) { - isNormal = false; + if (element instanceof PsiBreakStatement) { + PsiStatement exitedStatement = ((PsiBreakStatement)element).findExitedStatement(); + if (exitedStatement == null || flow.getStartOffset(exitedStatement) < startOffset) { + isNormal = false; + } + } + else if (element instanceof PsiContinueStatement) { + PsiStatement continuedStatement = ((PsiContinueStatement)element).findContinuedStatement(); + if (continuedStatement == null || flow.getStartOffset(continuedStatement) < startOffset) { + isNormal = false; + } } } canCompleteNormally[offset] |= isNormal; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/VoidValueCompatibilityWithBreakInSwitch.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/VoidValueCompatibilityWithBreakInSwitch.java new file mode 100644 index 000000000000..5ac6abfe00fa --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/VoidValueCompatibilityWithBreakInSwitch.java @@ -0,0 +1,13 @@ + +import java.util.concurrent.ExecutorService; + +class Test { + private void m(ExecutorService service, int i) { + service.submit(() -> { + switch (i) { + default: + break; + } + }); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index c9d66da652b2..d3c359315e34 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -161,6 +161,7 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { public void testConditionalExpressionInLambdaReturns() { doTest(); } public void testLambdaWithFormalTypeParameters() { doTest(); } public void testIDEA174924() { doTest(); } + public void testVoidValueCompatibilityWithBreakInSwitch() { doTest(); } private void doTest() { IdeaTestUtil.setTestVersion(JavaSdkVersion.JDK_1_8, getModule(), getTestRootDisposable());