From 8b9195d87bad0ee14e0a3eb7debeb29a4319b0ea Mon Sep 17 00:00:00 2001 From: "Roman.Ivanov" Date: Mon, 16 Apr 2018 17:17:12 +0700 Subject: [PATCH] IfStatementWithIdenticalBranches: explicit type for array assignment IDEA-190203 --- .../commonIfParts/afterArrayInitializer.java | 17 +++++++++++++++++ .../commonIfParts/beforeArrayInitializer.java | 17 +++++++++++++++++ ...atementWithIdenticalBranchesInspection.java | 18 +++++++++++++----- 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/inspection/commonIfParts/afterArrayInitializer.java create mode 100644 java/java-tests/testData/inspection/commonIfParts/beforeArrayInitializer.java diff --git a/java/java-tests/testData/inspection/commonIfParts/afterArrayInitializer.java b/java/java-tests/testData/inspection/commonIfParts/afterArrayInitializer.java new file mode 100644 index 000000000000..67f303331aaa --- /dev/null +++ b/java/java-tests/testData/inspection/commonIfParts/afterArrayInitializer.java @@ -0,0 +1,17 @@ +// "Extract common part with variables from if " "true" + +import java.util.List; +import java.util.Map; + +public class Main { + public static void main(String... args) { + int i = 1; + String[] array; + if (i % 2 == 0) { + array = new String[]{}; + } else { + array = new String[]{"not empty"}; + } + main(array); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/commonIfParts/beforeArrayInitializer.java b/java/java-tests/testData/inspection/commonIfParts/beforeArrayInitializer.java new file mode 100644 index 000000000000..eb2700caa29e --- /dev/null +++ b/java/java-tests/testData/inspection/commonIfParts/beforeArrayInitializer.java @@ -0,0 +1,17 @@ +// "Extract common part with variables from if " "true" + +import java.util.List; +import java.util.Map; + +public class Main { + public static void main(String... args) { + int i = 1; + if (i % 2 == 0) { + String[] array = {}; + main(array); + } else { + String[] array = {"not empty"}; + main(array); + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java index a059fb4abbc5..99754159966f 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java @@ -36,7 +36,7 @@ import java.util.stream.Collectors; import static com.intellij.util.ObjectUtils.tryCast; // Not really with identical branches, but also common parts -public class IfStatementWithIdenticalBranchesInspection extends BaseJavaBatchLocalInspectionTool { +public class IfStatementWithIdenticalBranchesInspection extends AbstractBaseJavaLocalInspectionTool { @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { @@ -276,6 +276,7 @@ public class IfStatementWithIdenticalBranchesInspection extends BaseJavaBatchLoc PsiVariable thenVariable = extractVariable(thenStatement); PsiLocalVariable elseVariable = extractVariable(elseStatement); if(thenVariable == null || elseVariable == null) return false; + String typeText = thenVariable.getType().getCanonicalText(); String thenVariableTypeText = thenVariable.getType().getCanonicalText(); PsiModifierList thenModifierList = thenVariable.getModifierList(); String modifiers; @@ -298,8 +299,8 @@ public class IfStatementWithIdenticalBranchesInspection extends BaseJavaBatchLoc PsiStatement varDeclarationStmt = factory.createStatementFromText(variableDeclaration, parent); parent.addBefore(varDeclarationStmt, ifStatement); - replaceWithDeclarationIfNeeded(ifStatement, factory, thenStatement, thenInitializer, varName); - replaceWithDeclarationIfNeeded(ifStatement, factory, elseStatement, elseInitializer, varName); + replaceWithDeclarationIfNeeded(ifStatement, factory, thenStatement, thenInitializer, varName, typeText); + replaceWithDeclarationIfNeeded(ifStatement, factory, elseStatement, elseInitializer, varName, typeText); continue; } } @@ -348,9 +349,16 @@ public class IfStatementWithIdenticalBranchesInspection extends BaseJavaBatchLoc PsiElementFactory factory, PsiStatement statement, PsiExpression initializer, - String varName) { + String varName, + String type) { if (initializer != null) { - PsiStatement assignment = factory.createStatementFromText(varName + "=" + initializer.getText() + ";", ifStatement); + final String initializerText; + if (initializer instanceof PsiArrayInitializerExpression) { + initializerText = "new " + type + initializer.getText(); + } else { + initializerText = initializer.getText(); + } + PsiStatement assignment = factory.createStatementFromText(varName + "=" + initializerText + ";", ifStatement); statement.replace(assignment); } }