From 424f56e89e73c007bf0d50833dd4c83c244c0dd8 Mon Sep 17 00:00:00 2001 From: "Roman.Ivanov" Date: Wed, 9 Jan 2019 18:30:46 +0700 Subject: [PATCH] IfCanBeSwitchInspection: make it aware of switch expression, move to impl module --- .../EnhancedSwitchMigrationInspection.java | 18 +++++++---- .../ig/migration/IfCanBeSwitchInspection.java | 14 ++++++-- .../if_can_be_switch/Java12.after.java | 11 +++++++ .../migration/if_can_be_switch/Java12.java | 13 ++++++++ .../IfCanBeSwitchSwitchExpressionFixTest.java | 32 +++++++++++++++++++ 5 files changed, 79 insertions(+), 9 deletions(-) rename plugins/InspectionGadgets/{InspectionGadgetsAnalysis => }/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java (97%) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/if_can_be_switch/Java12.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/if_can_be_switch/Java12.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/IfCanBeSwitchSwitchExpressionFixTest.java diff --git a/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchMigrationInspection.java b/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchMigrationInspection.java index 331abcccb1f5..fc1934b28d2a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchMigrationInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/EnhancedSwitchMigrationInspection.java @@ -31,7 +31,7 @@ public class EnhancedSwitchMigrationInspection extends AbstractBaseJavaLocalInsp return new JavaElementVisitor() { @Override public void visitSwitchStatement(PsiSwitchStatement statement) { - SwitchReplacer replacer = getSwitchReplacer(statement); + SwitchReplacer replacer = findSwitchReplacer(statement); if (replacer == null) return; PsiElement switchKeyword = statement.getFirstChild(); holder.registerProblem(switchKeyword, InspectionsBundle.message( @@ -109,8 +109,12 @@ public class EnhancedSwitchMigrationInspection extends AbstractBaseJavaLocalInsp return tryCast(declaredElements[0], PsiLocalVariable.class); } + /** + * Before using this method make sure you are using correct version of Java. + * + */ @Nullable - private static SwitchReplacer getSwitchReplacer(PsiSwitchStatement switchStatement) { + public static SwitchReplacer findSwitchReplacer(PsiSwitchStatement switchStatement) { PsiExpression expression = switchStatement.getExpression(); if (expression == null) return null; PsiCodeBlock body = switchStatement.getBody(); @@ -215,7 +219,7 @@ public class EnhancedSwitchMigrationInspection extends AbstractBaseJavaLocalInsp } } - private interface SwitchReplacer { + public interface SwitchReplacer { void replace(@NotNull PsiStatement switchStatement); ReplacementType getType(); @@ -252,7 +256,7 @@ public class EnhancedSwitchMigrationInspection extends AbstractBaseJavaLocalInsp public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { PsiSwitchStatement statement = PsiTreeUtil.getParentOfType(descriptor.getStartElement(), PsiSwitchStatement.class); if (statement == null) return; - SwitchReplacer replacer = getSwitchReplacer(statement); + SwitchReplacer replacer = findSwitchReplacer(statement); if (replacer == null) return; replacer.replace(statement); } @@ -309,7 +313,7 @@ public class EnhancedSwitchMigrationInspection extends AbstractBaseJavaLocalInsp */ @Nullable - public static SwitchReplacer inspectReturningSwitch(@NotNull PsiStatement statement, + private static SwitchReplacer inspectReturningSwitch(@NotNull PsiStatement statement, @NotNull PsiExpression expressionBeingSwitched, @NotNull List branches, boolean isExhaustive) { @@ -405,7 +409,7 @@ public class EnhancedSwitchMigrationInspection extends AbstractBaseJavaLocalInsp * } */ @Nullable - public static SwitchReplacer inspectVariableAssigningSwitch(@NotNull PsiStatement statement, + private static SwitchReplacer inspectVariableAssigningSwitch(@NotNull PsiStatement statement, @NotNull PsiExpression expressionBeingSwitched, @NotNull List branches, boolean isExhaustive) { @@ -476,7 +480,7 @@ public class EnhancedSwitchMigrationInspection extends AbstractBaseJavaLocalInsp * Suggest replacement with enhanced switch statement */ @Nullable - public static SwitchReplacer inspectReplacementWithStatement(@NotNull PsiStatement statement, + private static SwitchReplacer inspectReplacementWithStatement(@NotNull PsiStatement statement, @NotNull PsiExpression expressionBeingSwitched, @NotNull List branches, boolean isExhaustive) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java similarity index 97% rename from plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java rename to plugins/InspectionGadgets/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java index c767edc84487..b9bc6a17c69e 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/IfCanBeSwitchInspection.java @@ -17,14 +17,17 @@ package com.siyeh.ig.migration; import com.intellij.codeInsight.Nullability; import com.intellij.codeInspection.CommonQuickFixBundle; +import com.intellij.codeInspection.EnhancedSwitchMigrationInspection; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.dataFlow.NullabilityUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.util.ui.CheckBox; @@ -236,6 +239,7 @@ public class IfCanBeSwitchInspection extends BaseInspection { switchStatementText.append('}'); final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(ifStatement.getProject()); final PsiElementFactory factory = psiFacade.getElementFactory(); + PsiSwitchStatement replacement; if (breaksNeedRelabeled) { final StringBuilder out = new StringBuilder(); if (!(breakTarget instanceof PsiLabeledStatement)) { @@ -244,11 +248,17 @@ public class IfCanBeSwitchInspection extends BaseInspection { termReplace(breakTarget, statementToReplace, switchStatementText, out); final String newStatementText = out.toString(); final PsiStatement newStatement = factory.createStatementFromText(newStatementText, ifStatement); - breakTarget.replace(newStatement); + replacement = (PsiSwitchStatement)breakTarget.replace(newStatement); } else { final PsiStatement newStatement = factory.createStatementFromText(switchStatementText.toString(), ifStatement); - statementToReplace.replace(newStatement); + replacement = (PsiSwitchStatement)statementToReplace.replace(newStatement); + } + if (PsiUtil.getLanguageLevel(replacement).isAtLeast(LanguageLevel.JDK_12_PREVIEW)) { + EnhancedSwitchMigrationInspection.SwitchReplacer replacer = EnhancedSwitchMigrationInspection.findSwitchReplacer(replacement); + if (replacer != null) { + replacer.replace(replacement); + } } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/if_can_be_switch/Java12.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/if_can_be_switch/Java12.after.java new file mode 100644 index 000000000000..1355a0583d1a --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/if_can_be_switch/Java12.after.java @@ -0,0 +1,11 @@ +import java.util.Objects; + +class ObjectsEquals { + int objectsEquals(String param) { + return switch (param) { + case "a" -> 1; + case "b" -> 2; + default -> 3; + }; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/if_can_be_switch/Java12.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/if_can_be_switch/Java12.java new file mode 100644 index 000000000000..54d28aa8a960 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/if_can_be_switch/Java12.java @@ -0,0 +1,13 @@ +import java.util.Objects; + +class ObjectsEquals { + int objectsEquals(String param) { + if (Objects.equals(param, "a")) { + return 1; + } else if (Objects.equals(param, "b")) { + return 2; + } else { + return 3; + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/IfCanBeSwitchSwitchExpressionFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/IfCanBeSwitchSwitchExpressionFixTest.java new file mode 100644 index 000000000000..08b67d902f12 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/IfCanBeSwitchSwitchExpressionFixTest.java @@ -0,0 +1,32 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.siyeh.ig.fixes.migration; + +import com.intellij.codeInspection.CommonQuickFixBundle; +import com.intellij.pom.java.LanguageLevel; +import com.intellij.psi.PsiKeyword; +import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.builders.JavaModuleFixtureBuilder; +import com.siyeh.ig.IGQuickFixesTestCase; +import com.siyeh.ig.migration.IfCanBeSwitchInspection; + +public class IfCanBeSwitchSwitchExpressionFixTest extends IGQuickFixesTestCase { + @Override + public void setUp() throws Exception { + super.setUp(); + final IfCanBeSwitchInspection inspection = new IfCanBeSwitchInspection(); + inspection.minimumBranches = 2; + inspection.suggestIntSwitches = true; + myFixture.enableInspections(inspection); + myRelativePath = "migration/if_can_be_switch"; + myDefaultHint = CommonQuickFixBundle.message("fix.replace.x.with.y", PsiKeyword.IF, PsiKeyword.SWITCH); + } + + @Override + protected void tuneFixture(JavaModuleFixtureBuilder builder) throws Exception { + super.tuneFixture(builder); + builder.setLanguageLevel(LanguageLevel.JDK_12_PREVIEW); + builder.addJdk(IdeaTestUtil.getMockJdk18Path().getPath()); + } + + public void testJava12() { doTest();} +}