mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-165067 Unwrapping 'if' leads to non-compilable code
This commit is contained in:
+28
-1
@@ -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);
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
// "Unwrap 'if' statement" "true"
|
||||
class X {
|
||||
private final boolean field = true;
|
||||
|
||||
String m() {
|
||||
return "one";
|
||||
}
|
||||
}
|
||||
+9
@@ -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";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user