[java] handle empty statements in "'if' statement with identical branches" quick fix (IDEA-233980)

GitOrigin-RevId: 388e5c5195bda88b61526f0a393ed9d81ec18830
This commit is contained in:
Bas Leijdekkers
2024-02-15 00:54:37 +00:00
committed by intellij-monorepo-bot
parent d270d7f4d5
commit a8f1480bac
3 changed files with 65 additions and 12 deletions
@@ -366,17 +366,38 @@ public final class IfStatementWithIdenticalBranchesInspection extends AbstractBa
}
PsiStatement[] thenStatements = ControlFlowUtils.unwrapBlock(ifStatement.getThenBranch());
PsiStatement[] elseStatements = ControlFlowUtils.unwrapBlock(ifStatement.getElseBranch());
int thenLength = thenStatements.length;
int elseLength = elseStatements.length;
for (int i = 0; i < tailStatements.size(); i++) {
PsiStatement thenStatement = thenStatements[thenLength - 1 - i];
// handling situation, when there is no braces around then branch
if (thenStatements.length == 1 && thenStatement.getParent() == ifStatement) {
thenStatement.replace(JavaPsiFacade.getElementFactory(thenStatement.getProject()).createCodeBlock());
} else {
thenStatement.delete();
for (int i = thenStatements.length - 1; i >= 0; i--) {
PsiStatement statement = thenStatements[i];
if (!(statement instanceof PsiEmptyStatement)) break;
//emptyStatementCount++;
}
if (thenStatements.length == 1 && thenStatements[0].getParent() == ifStatement) {
thenStatements[0].replace(JavaPsiFacade.getElementFactory(ifStatement.getProject()).createCodeBlock());
}
else {
deleteStatements(thenStatements, tailStatements.size(), ct, false);
}
deleteStatements(elseStatements, tailStatements.size(), ct, true);
}
}
private static void deleteStatements(PsiStatement[] statements, int count, CommentTracker ct, boolean keepComments) {
for (int i = statements.length - 1; i >= 0; i--) {
PsiStatement statement = statements[i];
if (statement instanceof PsiEmptyStatement) {
ct.delete(statement);
}
else if (count > 0) {
count--;
if (keepComments) {
ct.delete(statement);
}
ct.delete(elseStatements[elseLength - 1 - i]);
else {
statement.delete();
}
}
else {
break;
}
}
}
@@ -776,12 +797,12 @@ public final class IfStatementWithIdenticalBranchesInspection extends AbstractBa
final Map<PsiLocalVariable, String> mySubstitutionTable;
private ThenElse(List<ExtractionUnit> headUnitsOfThen,
List<PsiStatement> tailUnitsOfThen,
List<PsiStatement> tailStatementsOfThen,
boolean mayChangeSemantics,
CommonPartType commonPartType,
Map<PsiLocalVariable, String> substitutionTable) {
myHeadUnitsOfThen = headUnitsOfThen;
myTailStatementsOfThen = tailUnitsOfThen;
myTailStatementsOfThen = tailStatementsOfThen;
myMayChangeSemantics = mayChangeSemantics;
myCommonPartType = commonPartType;
mySubstitutionTable = substitutionTable;
@@ -0,0 +1,15 @@
// "Extract common part removing branch" "true"
class EmptyStatements {
private void refactor() {
if (new java.util.Random().nextBoolean()) {
foo();
}
bar();
}
private void foo() {}
private void bar() {}
}
@@ -0,0 +1,17 @@
// "Extract common part removing branch" "true"
class EmptyStatements {
private void refactor() {
if<caret> (new java.util.Random().nextBoolean()) {
foo();
;;bar();;;;
} else {
bar();;
}
}
private void foo() {}
private void bar() {}
}