diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertSwitchToIfIntention.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertSwitchToIfIntention.java index 363d71f6eee8..394c2abd42d5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertSwitchToIfIntention.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertSwitchToIfIntention.java @@ -59,7 +59,7 @@ public class ConvertSwitchToIfIntention implements IntentionActionWithFixAllOpti private static boolean mayFallThroughNonTerminalDefaultCase(PsiCodeBlock body) { List labels = PsiTreeUtil.getChildrenOfTypeAsList(body, PsiSwitchLabelStatementBase.class); return StreamEx.of(labels).pairMap((prev, next) -> { - if (prev.isDefaultCase()) { + if (SwitchUtils.isDefaultLabel(prev)) { Set targets = getFallThroughTargets(body); return targets.contains(prev) || targets.contains(next); } @@ -211,7 +211,7 @@ public class ConvertSwitchToIfIntention implements IntentionActionWithFixAllOpti final PsiElement[] children = body.getChildren(); List labels = PsiTreeUtil.getChildrenOfTypeAsList(body, PsiSwitchLabelStatementBase.class); boolean defaultAlwaysExecuted = !labels.isEmpty() && - Objects.requireNonNull(ContainerUtil.getLastItem(labels)).isDefaultCase() && + SwitchUtils.isDefaultLabel(ContainerUtil.getLastItem(labels)) && fallThroughTargets.containsAll(labels.subList(1, labels.size())); for (int i = 1; i < children.length - 1; i++) { final PsiElement statement = children[i]; @@ -229,7 +229,7 @@ public class ConvertSwitchToIfIntention implements IntentionActionWithFixAllOpti allBranches.add(currentBranch); openBranches.add(currentBranch); } - if (label.isDefaultCase() && defaultAlwaysExecuted) { + if (SwitchUtils.isDefaultLabel(label) && defaultAlwaysExecuted) { openBranches.retainAll(Collections.singleton(currentBranch)); } currentBranch.addCaseValues(label, defaultAlwaysExecuted); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/afterUnwrapCaseDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/afterUnwrapCaseDefault.java new file mode 100644 index 000000000000..afdecf214839 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/afterUnwrapCaseDefault.java @@ -0,0 +1,9 @@ +// "Replace 'switch' with 'if'" "true" +public class One { + void f1(String a) { + if ("one".equals(a)) { + System.out.println(1); + } + System.out.println("default"); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeSingleCaseDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeSingleCaseDefault.java new file mode 100644 index 000000000000..2ee4ba53d917 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeSingleCaseDefault.java @@ -0,0 +1,10 @@ +// "Replace 'switch' with 'if'" "false" +abstract class Test { + abstract Object getObject(); + + void foo() { + switch (o) { + case default -> System.out.println("hello"); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeSingleCaseDefaultAndNull.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeSingleCaseDefaultAndNull.java new file mode 100644 index 000000000000..1e58d0176947 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeSingleCaseDefaultAndNull.java @@ -0,0 +1,10 @@ +// "Replace 'switch' with 'if'" "false" +abstract class Test { + abstract Object getObject(); + + void foo() { + switch (o) { + case default, null -> System.out.println("hello"); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeUnwrapCaseDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeUnwrapCaseDefault.java new file mode 100644 index 000000000000..b0e5fe74b15e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertSwitchToIf/beforeUnwrapCaseDefault.java @@ -0,0 +1,11 @@ +// "Replace 'switch' with 'if'" "true" +public class One { + void f1(String a) { + switch (a) { + case "one": + System.out.println(1); + case null, default: + System.out.println("default"); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/switchDefault/afterSingleCaseDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/switchDefault/afterSingleCaseDefault.java new file mode 100644 index 000000000000..683abf1c33b9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/switchDefault/afterSingleCaseDefault.java @@ -0,0 +1,6 @@ +// "Unwrap 'switch'" "true" +public class One { + void f1(String a) { + System.out.println("None"); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/switchDefault/beforeSingleCaseDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/switchDefault/beforeSingleCaseDefault.java new file mode 100644 index 000000000000..e6ab4025471b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/switchDefault/beforeSingleCaseDefault.java @@ -0,0 +1,8 @@ +// "Unwrap 'switch'" "true" +public class One { + void f1(String a) { + switch (a) { + case default -> System.out.println("None"); + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SwitchUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SwitchUtils.java index 56e1d56ad7b6..b8747b5f5be6 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SwitchUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SwitchUtils.java @@ -478,7 +478,8 @@ public final class SwitchUtils { return constants; } - public static boolean isDefaultLabel(PsiSwitchLabelStatementBase label) { + public static boolean isDefaultLabel(@Nullable PsiSwitchLabelStatementBase label) { + if (label == null) return false; if (label.isDefaultCase()) return true; PsiCaseLabelElementList labelElementList = label.getCaseLabelElementList(); if (labelElementList == null) return false; diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/switchtoif/SwitchPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/switchtoif/SwitchPredicate.java index 56f69f2225d0..2d782e116ce4 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/switchtoif/SwitchPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/switchtoif/SwitchPredicate.java @@ -18,6 +18,7 @@ package com.siyeh.ipp.switchtoif; import com.intellij.codeInsight.daemon.impl.quickfix.ConvertSwitchToIfIntention; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.siyeh.ig.psiutils.SwitchUtils; import com.siyeh.ipp.base.PsiElementPredicate; import com.siyeh.ipp.psiutils.ErrorUtil; import org.jetbrains.annotations.NotNull; @@ -58,7 +59,7 @@ class SwitchPredicate implements PsiElementPredicate { } final PsiStatement[] statements = body.getStatements(); for (PsiStatement statement : statements) { - if (statement instanceof PsiSwitchLabelStatementBase && !((PsiSwitchLabelStatementBase)statement).isDefaultCase()) { + if (statement instanceof PsiSwitchLabelStatementBase && !SwitchUtils.isDefaultLabel((PsiSwitchLabelStatementBase)statement)) { return true; } }