From 27aabab9665b1610088731136831ad376b5e25a4 Mon Sep 17 00:00:00 2001 From: "Roman.Ivanov" Date: Fri, 7 Dec 2018 16:25:56 +0700 Subject: [PATCH] EnhancedSwitchBackwardMigrationInspection: insert break in statement switch, when may complete normally --- ...ncedSwitchBackwardMigrationInspection.java | 22 +++++++++++++++---- .../afterSwitchStatements2.java | 19 ++++++++++++++++ .../afterSwitchStatementsReturn.java | 19 ++++++++++++++++ .../beforeSwitchStatements2.java | 19 ++++++++++++++++ .../beforeSwitchStatementsReturn.java | 20 +++++++++++++++++ 5 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatements2.java create mode 100644 java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatementsReturn.java create mode 100644 java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchStatements2.java create mode 100644 java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchStatementsReturn.java diff --git a/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchBackwardMigrationInspection.java b/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchBackwardMigrationInspection.java index 3b7b175e2a17..a6d3a1830d49 100644 --- a/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchBackwardMigrationInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchBackwardMigrationInspection.java @@ -210,12 +210,12 @@ public class EnhancedSwitchBackwardMigrationInspection extends AbstractBaseJavaL String caseValuesText = caseValues == null ? "" : ct.text(caseValues); PsiStatement body = rule.getBody(); String finalBody; - if (!(body instanceof PsiBlockStatement) && body != null) { + if (body == null) { + finalBody = ""; + } else if (!(body instanceof PsiBlockStatement)) { finalBody = generateExpressionBranch(body, ct); } else { - finalBody = StreamEx.of(ControlFlowUtils.unwrapBlock(body)) - .map(el -> ct.text(el)) - .joining("\n"); + finalBody = generateBlockBranch(body, ct); } ct.grabComments(rule); @@ -224,6 +224,12 @@ public class EnhancedSwitchBackwardMigrationInspection extends AbstractBaseJavaL return prefix + ":" + finalBody; } + String generateBlockBranch(@NotNull PsiStatement statement, CommentTracker ct) { + return StreamEx.of(ControlFlowUtils.unwrapBlock(statement)) + .map(el -> ct.text(el)) + .joining("\n"); + } + abstract void handleBreakInside(@NotNull PsiBreakStatement breakStatement, CommentTracker ct); abstract String generateExpressionBranch(@NotNull PsiStatement statement, CommentTracker ct); @@ -290,5 +296,13 @@ public class EnhancedSwitchBackwardMigrationInspection extends AbstractBaseJavaL String generateExpressionBranch(@NotNull PsiStatement statement, CommentTracker ct) { return ct.text(statement) + "\nbreak;"; } + + @Override + String generateBlockBranch(@NotNull PsiStatement statement, CommentTracker ct) { + if (ControlFlowUtils.statementMayCompleteNormally(statement)) { + return super.generateBlockBranch(statement, ct) + "\nbreak;"; + } + return super.generateBlockBranch(statement, ct); + } } } diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatements2.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatements2.java new file mode 100644 index 000000000000..dbe47278bf32 --- /dev/null +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatements2.java @@ -0,0 +1,19 @@ +// "Replace with old style 'switch' statement" "true" +import java.util.*; + +public class Main { + void foo(E e) { + switch (e) { + case E1, E2: + System.out.println("oops"); + break; + default: + System.out.println("impossible"); + break; + } + } +} + +enum E { + E1, E2; +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatementsReturn.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatementsReturn.java new file mode 100644 index 000000000000..08a19bdfc9fc --- /dev/null +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatementsReturn.java @@ -0,0 +1,19 @@ +// "Replace with old style 'switch' statement" "true" +import java.util.*; + +public class Main { + void foo(E e) { + switch (e) { + case E1, E2: + System.out.println("oops"); + break; + default: + System.out.println("impossible"); + return; + } + } +} + +enum E { + E1, E2; +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchStatements2.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchStatements2.java new file mode 100644 index 000000000000..2cc651651a3b --- /dev/null +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchStatements2.java @@ -0,0 +1,19 @@ +// "Replace with old style 'switch' statement" "true" +import java.util.*; + +public class Main { + void foo(E e) { + switch (e) { + case E1, E2 -> { + System.out.println("oops"); + } + default -> { + System.out.println("impossible"); + } + } + } +} + +enum E { + E1, E2; +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchStatementsReturn.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchStatementsReturn.java new file mode 100644 index 000000000000..51ce7632d59f --- /dev/null +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchStatementsReturn.java @@ -0,0 +1,20 @@ +// "Replace with old style 'switch' statement" "true" +import java.util.*; + +public class Main { + void foo(E e) { + switch (e) { + case E1, E2 -> { + System.out.println("oops"); + } + default -> { + System.out.println("impossible"); + return; + } + } + } +} + +enum E { + E1, E2; +} \ No newline at end of file