From e2bcaddbe3f6854c1facb87988cffb5729573ae5 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 19 Jul 2022 15:36:48 +0200 Subject: [PATCH] java inspectin: merge switch case label element lists when possible in "Duplicate branches in 'switch'" inspection fix GitOrigin-RevId: 7b22a3409f5d9237f432ab3dd35f27cacfbd7737 --- .../DuplicateBranchesInSwitchInspection.java | 21 +++++++++++++++++-- .../DuplicateBranchesInSwitch.html | 2 +- .../afterCaseLabelsExpression.java | 3 +-- ...CaseLabelsExpressionDefaultFirstMerge.java | 3 +-- ...rCaseLabelsExpressionDefaultLastMerge.java | 3 +-- .../afterBreakAndReturnUnderIf.java | 3 +-- .../afterComplexBranches.java | 3 +-- .../afterContinue.java | 3 +-- .../afterFallThroughToBreak.java | 3 +-- .../afterFallThroughToBreak2.java | 3 +-- .../afterLeftoverComments.java | 3 +-- .../afterManyComments.java | 3 +-- .../afterMethodCallInReturn.java | 4 +--- .../afterNoLastBreak.java | 3 +-- .../afterReturn.java | 3 +-- .../afterSameCommentAfterLabel.java | 3 +-- .../afterSameCommentBeforeLabel.java | 3 +-- .../afterSimple.java | 3 +-- .../afterThreeDuplicates.java | 3 +-- .../afterThrow.java | 3 +-- .../afterTwoCaseLabels.java | 3 +-- 21 files changed, 39 insertions(+), 42 deletions(-) diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/DuplicateBranchesInSwitchInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/DuplicateBranchesInSwitchInspection.java index 1b9b07f1c88e..f620efcd0db9 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/DuplicateBranchesInSwitchInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/DuplicateBranchesInSwitchInspection.java @@ -1,4 +1,4 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInspection; import com.intellij.codeInspection.util.InspectionMessage; @@ -405,7 +405,24 @@ public final class DuplicateBranchesInSwitchInspection extends LocalInspectionTo PsiElement prevElement = PsiTreeUtil.skipWhitespacesAndCommentsBackward(myLabelToMergeWith); if (prevElement != null) moveTarget = prevElement; } - moveTarget.getParent().addRangeAfter(firstElementToMove, lastElementToMove, moveTarget); + if (PsiUtil.isLanguageLevel14OrHigher(moveTarget) && moveTarget instanceof PsiSwitchLabelStatement) { + final PsiSwitchLabelStatement labelStatement = (PsiSwitchLabelStatement)moveTarget; + final PsiCaseLabelElementList caseLabelElementList = labelStatement.getCaseLabelElementList(); + assert caseLabelElementList != null; + for (PsiElement element : myBranchPrefixToMove) { + if (element instanceof PsiSwitchLabelStatement) { + final PsiSwitchLabelStatement statement = (PsiSwitchLabelStatement)element; + final PsiCaseLabelElementList list1 = statement.getCaseLabelElementList(); + assert list1 != null; + for (PsiCaseLabelElement labelElement : list1.getElements()) { + caseLabelElementList.addAfter(labelElement, caseLabelElementList.getLastChild()); + } + } + } + } + else { + moveTarget.getParent().addRangeAfter(firstElementToMove, lastElementToMove, moveTarget); + } firstElementToMove.getParent().deleteChildRange(firstElementToMove, lastElementToMove); } diff --git a/java/java-impl/src/inspectionDescriptions/DuplicateBranchesInSwitch.html b/java/java-impl/src/inspectionDescriptions/DuplicateBranchesInSwitch.html index c64d53ac61ff..fd38a5d63889 100644 --- a/java/java-impl/src/inspectionDescriptions/DuplicateBranchesInSwitch.html +++ b/java/java-impl/src/inspectionDescriptions/DuplicateBranchesInSwitch.html @@ -15,7 +15,7 @@ and suggests merging the duplicate branches. System.out.println("default"); } -

Can be replaced with:

+

After the quick-fix is applied:


   switch (n) {
     case 1:
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpression.java b/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpression.java
index 4455c2428f90..af14496af364 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpression.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpression.java
@@ -2,8 +2,7 @@
 class C {
     void test(int n) {
         String s = switch (n) {
-            case 1:
-            case 3:
+            case 1, 3:
                 break "a";
             case 2:
                 break "b";
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpressionDefaultFirstMerge.java b/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpressionDefaultFirstMerge.java
index 47522b59f6f1..667d9f499de0 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpressionDefaultFirstMerge.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpressionDefaultFirstMerge.java
@@ -3,8 +3,7 @@ class C {
     void test(int n) {
         String s = switch (n) {
             default:
-            case 1:
-            case 3:
+            case 1, 3:
                 break "a";
             case 2:
                 break "b";
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpressionDefaultLastMerge.java b/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpressionDefaultLastMerge.java
index 6eda63e512b9..d4c777637753 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpressionDefaultLastMerge.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInEnhancedSwitchFix/afterCaseLabelsExpressionDefaultLastMerge.java
@@ -4,8 +4,7 @@ class C {
         String s = switch (n) {
             case 2:
                 break "b";
-            case 3:
-            case 1:
+            case 3, 1:
             default:
                 break "a";
         };
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterBreakAndReturnUnderIf.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterBreakAndReturnUnderIf.java
index e3b8c7f7e8ba..e31200f88832 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterBreakAndReturnUnderIf.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterBreakAndReturnUnderIf.java
@@ -2,8 +2,7 @@
 class C {
     int foo(int n, boolean b) {
         switch (n) {
-            case 1:
-            case 3:
+            case 1, 3:
                 if(b) {
                     return bar("A");
                 } else {
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterComplexBranches.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterComplexBranches.java
index 09033a9151c7..206441211adb 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterComplexBranches.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterComplexBranches.java
@@ -2,8 +2,7 @@
 class C {
     void foo(int n, boolean b) {
         switch (n) {
-            case 1:
-            case 3:
+            case 1, 3:
                 if(b) {
                     bar("A");
                 } else {
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterContinue.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterContinue.java
index 9e4c5d58f8d4..18425337a752 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterContinue.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterContinue.java
@@ -4,8 +4,7 @@ class C {
         int s = 0;
         for (int i = 0; i < n; i++) {
             switch (i % 4) {
-                case 1:
-                case 3:
+                case 1, 3:
                     s += i;
                     continue;
                 case 2:
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterFallThroughToBreak.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterFallThroughToBreak.java
index 002cb2d35821..0326af28b208 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterFallThroughToBreak.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterFallThroughToBreak.java
@@ -2,8 +2,7 @@
 class C {
     void foo(int n) {
         switch (n) {
-            case 1:
-            case 3:
+            case 1, 3:
                 bar("A");
             case 2:
                 break;
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterFallThroughToBreak2.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterFallThroughToBreak2.java
index 24577f44b177..013c3bc9423c 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterFallThroughToBreak2.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterFallThroughToBreak2.java
@@ -2,8 +2,7 @@
 class C {
     void foo(int n) {
         switch (n) {
-            case 1:
-            case 4:
+            case 1, 4:
                 bar("A");
             case 2:
                 break;
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterLeftoverComments.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterLeftoverComments.java
index 8eb3113242b3..622713288c96 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterLeftoverComments.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterLeftoverComments.java
@@ -2,8 +2,7 @@
 class C {
     String foo(int n) {
         switch (n) {
-            case 1:
-            case 2:
+            case 1, 2:
                 foo(); // same comment
                 return "A";
             // another comment
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterManyComments.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterManyComments.java
index 1455567a28f5..b97930124306 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterManyComments.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterManyComments.java
@@ -3,8 +3,7 @@ class C {
     String foo(int n) {
         switch (n) {
             /* comment 1 */
-            case 1:
-            case 2:
+            case 1, 2:
                 /* comment 2 */
                 return "A"; // comment 3
         }
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterMethodCallInReturn.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterMethodCallInReturn.java
index 84961ace2a60..059ac7388790 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterMethodCallInReturn.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterMethodCallInReturn.java
@@ -4,9 +4,7 @@ enum T {
 
     int foo(T t) {
         switch (t) {
-            case A:
-
-            case B:
+            case A, B:
                 return t.ordinal(); // comment 1
 
             case C:
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterNoLastBreak.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterNoLastBreak.java
index 06cdd065f877..790abff9b692 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterNoLastBreak.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterNoLastBreak.java
@@ -2,8 +2,7 @@
 class C {
     void foo(int n) {
         switch (n) {
-            case 1:
-            case 3:
+            case 1, 3:
                 bar("A");
                 break;
             case 2:
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterReturn.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterReturn.java
index 9679df567db8..a242215613fc 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterReturn.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterReturn.java
@@ -2,8 +2,7 @@
 class C {
     String foo(int n) {
         switch (n) {
-            case 1:
-            case 3:
+            case 1, 3:
                 return "A";
             case 2:
                 return "B";
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSameCommentAfterLabel.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSameCommentAfterLabel.java
index 2a867c3c910c..8a95e4d7c0dd 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSameCommentAfterLabel.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSameCommentAfterLabel.java
@@ -2,8 +2,7 @@
 class C {
     String foo(int n) {
         switch (n) {
-            case 1:
-            case 2:
+            case 1, 2:
                 /* comment 1 */
                 return "A";
         }
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSameCommentBeforeLabel.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSameCommentBeforeLabel.java
index 3029a29fc576..f51b2e22ba43 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSameCommentBeforeLabel.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSameCommentBeforeLabel.java
@@ -3,8 +3,7 @@ class C {
     void foo(int n) {
         switch (n) {
             // comment
-            case 1:
-            case 2:
+            case 1, 2:
                 bar("A");
                 break;
         }
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSimple.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSimple.java
index 06cdd065f877..790abff9b692 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSimple.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterSimple.java
@@ -2,8 +2,7 @@
 class C {
     void foo(int n) {
         switch (n) {
-            case 1:
-            case 3:
+            case 1, 3:
                 bar("A");
                 break;
             case 2:
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterThreeDuplicates.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterThreeDuplicates.java
index 9f841586d3dc..54351b57d436 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterThreeDuplicates.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterThreeDuplicates.java
@@ -2,8 +2,7 @@
 class C {
     void foo(int n) {
         switch (n) {
-            case 1:
-            case 4:
+            case 1, 4:
                 bar("A");
                 break;
             case 2:
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterThrow.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterThrow.java
index 5010a082f8a1..7729d89077ee 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterThrow.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterThrow.java
@@ -2,8 +2,7 @@
 class C {
     String foo(int n) {
         switch (n) {
-            case 1:
-            case 3:
+            case 1, 3:
                 throw new IllegalArgumentException("A");
             case 2:
                 throw new IllegalStateException("A");
diff --git a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterTwoCaseLabels.java b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterTwoCaseLabels.java
index f40b3447f91e..aaedf99027e5 100644
--- a/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterTwoCaseLabels.java
+++ b/java/java-tests/testData/inspection/duplicateBranchesInSwitchFix/afterTwoCaseLabels.java
@@ -3,8 +3,7 @@ class C {
     void foo(int n) {
         switch (n) {
             case 1:
-            case 2:
-            case 3:
+            case 2, 3:
                 bar("A");
                 break;
             case 4: