IDEA-165067 Unwrapping 'if' leads to non-compilable code

This commit is contained in:
peter
2016-12-22 14:06:29 +01:00
parent e7c54c02bb
commit 66b8d67f53
3 changed files with 45 additions and 1 deletions
@@ -17,6 +17,7 @@
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.codeInspection.LocalQuickFixOnPsiElement;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
@@ -24,6 +25,8 @@ import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.controlFlow.AnalysisCanceledException;
import com.intellij.psi.controlFlow.ControlFlowUtil;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
@@ -32,8 +35,10 @@ import com.siyeh.ig.psiutils.DeclarationSearchUtils;
import com.siyeh.ig.psiutils.ParenthesesUtils;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
@@ -118,13 +123,18 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
return true;
}
private static void replaceWithStatements(final PsiIfStatement orig, final PsiStatement statement) throws IncorrectOperationException {
private static void replaceWithStatements(@NotNull PsiIfStatement orig, @Nullable PsiStatement statement) throws IncorrectOperationException {
if (statement == null) {
orig.delete();
return;
}
PsiElement parent = orig.getParent();
if (parent == null) return;
if (parent instanceof PsiCodeBlock && blockAlwaysReturns(statement)) {
removeFollowingStatements(orig, (PsiCodeBlock)parent);
}
if (statement instanceof PsiBlockStatement && parent instanceof PsiCodeBlock &&
!DeclarationSearchUtils.containsConflictingDeclarations(((PsiBlockStatement)statement).getCodeBlock(), (PsiCodeBlock)parent)) {
// See IDEADEV-24277
@@ -153,6 +163,23 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
}
}
private static boolean blockAlwaysReturns(@NotNull PsiStatement statement) {
try {
return ControlFlowUtil.returnPresent(HighlightControlFlowUtil.getControlFlowNoConstantEvaluate(statement));
}
catch (AnalysisCanceledException e) {
return false;
}
}
private static void removeFollowingStatements(@NotNull PsiIfStatement anchor, @NotNull PsiCodeBlock parentBlock) {
PsiStatement[] siblingStatements = parentBlock.getStatements();
int ifIndex = Arrays.asList(siblingStatements).indexOf(anchor);
if (ifIndex >= 0 && ifIndex < siblingStatements.length - 1) {
parentBlock.deleteChildRange(siblingStatements[ifIndex + 1], siblingStatements[siblingStatements.length - 1]);
}
}
public static void simplifyExpression(PsiExpression expression) throws IncorrectOperationException {
final PsiExpression[] result = {(PsiExpression)expression.copy()};
final ExpressionVisitor expressionVisitor = new ExpressionVisitor(expression.getManager(), true);
@@ -0,0 +1,8 @@
// "Unwrap 'if' statement" "true"
class X {
private final boolean field = true;
String m() {
return "one";
}
}
@@ -0,0 +1,9 @@
// "Unwrap 'if' statement" "true"
class X {
private final boolean field = true;
String m() {
if (fiel<caret>d) return "one";
return "two";
}
}