[java-inspections] Delete switch branch when guard is false

Part of IDEA-326939 Support multi-pattern switch labels that define no variables

GitOrigin-RevId: 6d089c7e9f705a28f29376f1208ed39d4c8aa881
This commit is contained in:
Tagir Valeev
2023-08-17 11:34:02 +02:00
committed by intellij-monorepo-bot
parent efbff7c99c
commit dbccf5f59b
4 changed files with 42 additions and 2 deletions

View File

@@ -8,9 +8,11 @@ import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.codeInsight.intention.impl.SplitConditionUtil;
import com.intellij.codeInspection.CommonQuickFixBundle;
import com.intellij.codeInspection.dataFlow.NullabilityProblemKind;
import com.intellij.codeInspection.dataFlow.fix.DeleteSwitchLabelFix;
import com.intellij.codeInspection.util.IntentionFamilyName;
import com.intellij.codeInspection.util.IntentionName;
import com.intellij.java.JavaBundle;
import com.intellij.java.analysis.JavaAnalysisBundle;
import com.intellij.modcommand.ActionContext;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.Presentation;
@@ -88,6 +90,9 @@ public class SimplifyBooleanExpressionFix extends PsiUpdateModCommandAction<PsiE
CommonQuickFixBundle.message("fix.unwrap.statement", PsiKeyword.IF) :
CommonQuickFixBundle.message("fix.remove.statement", PsiKeyword.IF);
}
if (parent instanceof PsiSwitchLabelStatementBase && !constantValue) {
return JavaAnalysisBundle.message("remove.switch.label");
}
if (!constantValue) {
if (parent instanceof PsiWhileStatement) return CommonQuickFixBundle.message("fix.remove.statement", PsiKeyword.WHILE);
if (parent instanceof PsiDoWhileStatement) return CommonQuickFixBundle.message("fix.unwrap.statement", "do-while");
@@ -357,12 +362,16 @@ public class SimplifyBooleanExpressionFix extends PsiUpdateModCommandAction<PsiE
public static void simplifyExpression(PsiExpression expression) throws IncorrectOperationException {
final PsiExpression result = createSimplifiedReplacement(expression);
PsiExpression newExpression = (PsiExpression)new CommentTracker().replaceAndRestoreComments(expression, result);
if (newExpression instanceof PsiLiteralExpression) {
if (newExpression instanceof PsiLiteralExpression literal) {
final PsiElement parent = newExpression.getParent();
if (parent instanceof PsiAssertStatement && ((PsiLiteralExpression)newExpression).getValue() == Boolean.TRUE) {
Object value = literal.getValue();
if (parent instanceof PsiAssertStatement && Boolean.TRUE.equals(value)) {
parent.delete();
return;
}
if (parent instanceof PsiSwitchLabelStatementBase label && Boolean.FALSE.equals(value)) {
DeleteSwitchLabelFix.deleteLabel(label);
}
}
if (!simplifyIfOrLoopStatement(newExpression)) {
ParenthesesUtils.removeParentheses(newExpression, false);

View File

@@ -0,0 +1,10 @@
// "Remove switch label" "true-preview"
class X {
void test(Object obj) {
switch (obj) {
default:
System.out.println("something else");
break;
}
}
}

View File

@@ -0,0 +1,13 @@
// "Remove switch label" "true-preview"
class X {
void test(Object obj) {
switch (obj) {
case String s when s.length()<caret> < 0:
System.out.println("oops");
break;
default:
System.out.println("something else");
break;
}
}
}

View File

@@ -5,8 +5,11 @@ import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCa
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.dataFlow.ConstantValueInspection;
import com.intellij.codeInspection.dataFlow.DataFlowInspection;
import com.intellij.testFramework.LightProjectDescriptor;
import org.jetbrains.annotations.NotNull;
import static com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase.JAVA_21;
public class SimplifyBooleanExpressionFixTest extends LightQuickFixParameterizedTestCase {
@Override
@@ -14,6 +17,11 @@ public class SimplifyBooleanExpressionFixTest extends LightQuickFixParameterized
return new LocalInspectionTool[]{new ConstantValueInspection()};
}
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_21;
}
@Override
protected String getBasePath() {
return "/codeInsight/daemonCodeAnalyzer/quickFix/simplifyBooleanExpressionFix";