diff --git a/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchBackwardMigrationInspection.java b/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchBackwardMigrationInspection.java index 23c1a6f564eb..a5470ae07795 100644 --- a/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchBackwardMigrationInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchBackwardMigrationInspection.java @@ -9,6 +9,7 @@ import com.intellij.psi.util.PsiTypesUtil; import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.ig.psiutils.SwitchUtils; +import gnu.trove.TIntArrayList; import one.util.streamex.StreamEx; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -173,11 +174,15 @@ public class EnhancedSwitchBackwardMigrationInspection extends AbstractBaseJavaL .select(PsiSwitchLabeledRuleStatement.class) .toList(); List branchTrackers = new ArrayList<>(); + TIntArrayList caseCounts = new TIntArrayList(); StringJoiner joiner = new StringJoiner("\n"); for (PsiSwitchLabeledRuleStatement rule : rules) { CommentTracker ct = new CommentTracker(); branchTrackers.add(ct); String generate = generateBranch(rule, ct, switchCopy); + PsiExpressionList values = rule.getCaseValues(); + int caseCount = values == null ? 1 : values.getExpressionCount(); + caseCounts.add(caseCount); joiner.add(generate); mainCommentTracker.markUnchanged(rule); } @@ -190,10 +195,16 @@ public class EnhancedSwitchBackwardMigrationInspection extends AbstractBaseJavaL List branches = StreamEx.of(newBody.getStatements()) .select(PsiSwitchLabelStatement.class) .toList(); - if (branches.size() != branchTrackers.size()) return newBlock; - for (int i = 0; i < branches.size(); i++) { - PsiSwitchLabelStatement branch = branches.get(i); + int totalCaseStatements = 0; + for (int i = 0; i < caseCounts.size(); i++) { + totalCaseStatements += caseCounts.get(i); + } + if (branches.size() != totalCaseStatements) return newBlock; + int firstCaseInChainIndex = 0; + for (int i = 0; i < branchTrackers.size(); i++) { + PsiSwitchLabelStatement branch = branches.get(firstCaseInChainIndex); branchTrackers.get(i).insertCommentsBefore(branch); + firstCaseInChainIndex += caseCounts.get(i); } return newBlock; } @@ -207,7 +218,17 @@ public class EnhancedSwitchBackwardMigrationInspection extends AbstractBaseJavaL .filter(breakStatement -> breakStatement.getValueExpression() != null && breakStatement.findExitedElement() == switchBlock) .forEach(breakStatement -> handleBreakInside(breakStatement, ct)); PsiExpressionList caseValues = rule.getCaseValues(); - String caseValuesText = caseValues == null ? "" : ct.text(caseValues); + String caseExpressionsText; + if (caseValues == null || caseValues.isEmpty()) { + if (rule.isDefaultCase()) { + caseExpressionsText = "default:"; + } else { + caseExpressionsText = "case:"; + } + } else { + PsiExpression[] expressions = caseValues.getExpressions(); + caseExpressionsText = StreamEx.of(expressions).map(e -> "case " + ct.text(e) + ":").joining("\n"); + } PsiStatement body = rule.getBody(); String finalBody; if (body == null) { @@ -218,10 +239,7 @@ public class EnhancedSwitchBackwardMigrationInspection extends AbstractBaseJavaL finalBody = generateBlockBranch(body, ct); } ct.grabComments(rule); - - - String prefix = rule.isDefaultCase() ? "default" : "case " + caseValuesText; - return prefix + ":" + finalBody; + return caseExpressionsText + finalBody; } String generateBlockBranch(@NotNull PsiStatement statement, CommentTracker ct) { diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchNoCaseExpressions.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchNoCaseExpressions.java new file mode 100644 index 000000000000..da17c74248cb --- /dev/null +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchNoCaseExpressions.java @@ -0,0 +1,13 @@ +// "Replace with old style 'switch' statement" "true" +import java.util.*; + +class SwitchExpressionMigration { + int foo(int n) { + switch (n) { + case : + return 12; + default: + return 0; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchReturning.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchReturning.java index 4621d588eb41..1cabc7f96666 100644 --- a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchReturning.java +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchReturning.java @@ -11,7 +11,8 @@ class SwitchExpressionMigration { return 1; case 2: return 2; - case 3, 4: + case 3: + case 4: System.out.println("asda"); return 3; default: diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchReturningComments.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchReturningComments.java index ff953d4fb6f0..392b7dfb0609 100644 --- a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchReturningComments.java +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchReturningComments.java @@ -14,7 +14,8 @@ class SwitchExpressionMigration { /*16*/ case 2: return 2 +/*17*/ 2; - case 3, 4: + case 3 /*in1*/ + 1: + case 4 /*in2*/ + 33: System.out.println("asda"); return 3; /*19*/ diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatements2.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatements2.java index dbe47278bf32..5a70edb9c193 100644 --- a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatements2.java +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatements2.java @@ -4,7 +4,8 @@ import java.util.*; public class Main { void foo(E e) { switch (e) { - case E1, E2: + case E1: + case E2: System.out.println("oops"); break; default: diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatementsReturn.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatementsReturn.java index 08a19bdfc9fc..d9b6abc8397f 100644 --- a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatementsReturn.java +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchStatementsReturn.java @@ -4,7 +4,8 @@ import java.util.*; public class Main { void foo(E e) { switch (e) { - case E1, E2: + case E1: + case E2: System.out.println("oops"); break; default: diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchVarAssigning.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchVarAssigning.java index ccc0b5f93e2f..8c057a5eb3c7 100644 --- a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchVarAssigning.java +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchVarAssigning.java @@ -16,7 +16,8 @@ class SwitchExpressionMigration { case 2: x = 2; break; - case 3, 4: + case 3: + case 4: System.out.println("asda"); x = 3; break; diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchVarAssigningComments.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchVarAssigningComments.java index 0ac9b558f2f5..3b2d9b735faf 100644 --- a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchVarAssigningComments.java +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/afterSwitchVarAssigningComments.java @@ -20,7 +20,8 @@ class SwitchExpressionMigration { case 2: x = 2; break; - case 3, 4: + case 3: + case 4: System.out.println("asda"); x = 3; break; diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchNoCaseExpressions.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchNoCaseExpressions.java new file mode 100644 index 000000000000..c7db79eba74d --- /dev/null +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchNoCaseExpressions.java @@ -0,0 +1,11 @@ +// "Replace with old style 'switch' statement" "true" +import java.util.*; + +class SwitchExpressionMigration { + int foo(int n) { + return switch (n) { + case -> 12; + default -> 0; + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchReturningComments.java b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchReturningComments.java index 38f742e6ca0e..e1721490e9b0 100644 --- a/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchReturningComments.java +++ b/java/java-tests/testData/inspection/switchExpressionBackwardMigration/beforeSwitchReturningComments.java @@ -10,7 +10,7 @@ class SwitchExpressionMigration { break 1; } case/*15*/ 2 -> /*16*/2 +/*17*/ 2; - case 3, 4 -> { + case 3 /*in1*/ + 1, 4 /*in2*/+ 33 -> { System.out.println("asda"); break 3; }