when "if" or a loop body is deleted, replace it with an empty code block

to preserve PSI-text consistency
This commit is contained in:
peter
2018-09-21 13:47:52 +02:00
parent fd27cff607
commit 9f0c066ae9
12 changed files with 85 additions and 31 deletions

View File

@@ -88,8 +88,8 @@ public class DeleteCatchFix implements IntentionAction {
}
}
else {
tryParent.addBefore(tryBlock, tryStatement);
lastAddedStatement = tryBlock;
tryStatement.replace(tryBlock);
return tryBlock;
}
}
}

View File

@@ -244,12 +244,15 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
}
private static PsiBlockStatement wrapWithCodeBlock(PsiStatement replacement) {
PsiBlockStatement newBlock = (PsiBlockStatement)
JavaPsiFacade.getElementFactory(replacement.getProject()).createStatementFromText("{}", null);
PsiBlockStatement newBlock = createBlockStatement(replacement.getProject());
newBlock.getCodeBlock().add(replacement);
return newBlock;
}
private static PsiBlockStatement createBlockStatement(Project project) {
return (PsiBlockStatement)JavaPsiFacade.getElementFactory(project).createStatementFromText("{}", null);
}
private static void inlineBlockStatements(@NotNull PsiStatement orig, @NotNull PsiBlockStatement statement, PsiElement parent) {
// See IDEADEV-24277
// Code block can only be inlined into another (parent) code block.

View File

@@ -19,15 +19,14 @@ import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.impl.source.tree.CompositePsiElement;
import com.intellij.psi.impl.source.tree.TreeUtil;
import com.intellij.psi.impl.source.Constants;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.impl.source.tree.TreeUtil;
import com.intellij.psi.tree.ChildRoleBase;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
public class PsiDoWhileStatementImpl extends CompositePsiElement implements PsiDoWhileStatement, Constants {
public class PsiDoWhileStatementImpl extends PsiLoopStatementImpl implements PsiDoWhileStatement, Constants {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.PsiDoWhileStatementImpl");
public PsiDoWhileStatementImpl() {

View File

@@ -19,19 +19,16 @@ import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.Constants;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.impl.source.tree.CompositePsiElement;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.scope.util.PsiScopesUtil;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.ChildRoleBase;
import com.intellij.util.IncorrectOperationException;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
public class PsiForStatementImpl extends CompositePsiElement implements PsiForStatement, Constants {
public class PsiForStatementImpl extends PsiLoopStatementImpl implements PsiForStatement, Constants {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.PsiForStatementImpl");
public PsiForStatementImpl() {
@@ -174,16 +171,8 @@ public class PsiForStatementImpl extends CompositePsiElement implements PsiForSt
@Override
public void deleteChildInternal(@NotNull ASTNode child) {
final boolean isForInitialization = getChildRole(child) == ChildRole.FOR_INITIALIZATION;
if (isForInitialization) {
try {
final PsiStatement emptyStatement = JavaPsiFacade.getInstance(getProject()).getElementFactory().createStatementFromText(";", null);
super.replaceChildInternal(child, (TreeElement)SourceTreeToPsiMap.psiElementToTree(emptyStatement));
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
if (getChildRole(child) == ChildRole.FOR_INITIALIZATION) {
replaceChildInternal(child, (TreeElement)JavaPsiFacade.getElementFactory(getProject()).createStatementFromText(";", null));
}
else {
super.deleteChildInternal(child);

View File

@@ -21,7 +21,6 @@ import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.Constants;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.impl.source.tree.CompositePsiElement;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.tree.ChildRoleBase;
import com.intellij.psi.tree.IElementType;
@@ -30,7 +29,7 @@ import org.jetbrains.annotations.NotNull;
/**
* @author dsl
*/
public class PsiForeachStatementImpl extends CompositePsiElement implements PsiForeachStatement, Constants {
public class PsiForeachStatementImpl extends PsiLoopStatementImpl implements PsiForeachStatement, Constants {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.PsiForeachStatementImpl");
public PsiForeachStatementImpl() {
super(FOREACH_STATEMENT);

View File

@@ -23,6 +23,7 @@ import com.intellij.psi.impl.source.Constants;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.impl.source.tree.CompositePsiElement;
import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.tree.ChildRoleBase;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.IncorrectOperationException;
@@ -42,7 +43,10 @@ public class PsiIfStatementImpl extends CompositePsiElement implements PsiIfStat
@Override
public void deleteChildInternal(@NotNull ASTNode child) {
if (child == getElseBranch()) {
if (child == getThenBranch()) {
replaceChildInternal(child, (TreeElement)JavaPsiFacade.getElementFactory(getProject()).createStatementFromText("{}", null));
return;
} else if (child == getElseBranch()) {
ASTNode elseKeyword = findChildByRole(ChildRole.ELSE_KEYWORD);
if (elseKeyword != null) {
super.deleteChildInternal(elseKeyword);

View File

@@ -0,0 +1,25 @@
// Copyright 2000-2018 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.intellij.psi.impl.source.tree.java;
import com.intellij.lang.ASTNode;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiLoopStatement;
import com.intellij.psi.impl.source.tree.CompositePsiElement;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
abstract class PsiLoopStatementImpl extends CompositePsiElement implements PsiLoopStatement {
protected PsiLoopStatementImpl(IElementType type) {
super(type);
}
@Override
public void deleteChildInternal(@NotNull ASTNode child) {
if (child == getBody()) {
replaceChildInternal(child, (TreeElement)JavaPsiFacade.getElementFactory(getProject()).createStatementFromText("{}", null));
} else {
super.deleteChildInternal(child);
}
}
}

View File

@@ -19,14 +19,13 @@ import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.impl.source.tree.CompositePsiElement;
import com.intellij.psi.impl.source.Constants;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.impl.source.tree.ChildRole;
import com.intellij.psi.tree.ChildRoleBase;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
public class PsiWhileStatementImpl extends CompositePsiElement implements PsiWhileStatement, Constants {
public class PsiWhileStatementImpl extends PsiLoopStatementImpl implements PsiWhileStatement, Constants {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.PsiWhileStatementImpl");
public PsiWhileStatementImpl() {

View File

@@ -0,0 +1,8 @@
// "Remove 'if' statement" "true"
class X {
int m(String s) {
for (int i = 0; i < 100; i++) {
}
return 1;
}
}

View File

@@ -0,0 +1,8 @@
// "Remove 'if' statement" "true"
class X {
int m(String s) {
if (s.equals("abc")) {
}
return 1;
}
}

View File

@@ -0,0 +1,10 @@
// "Remove 'if' statement" "true"
class X {
int m(String s) {
for (int i = 0; i < 100; i++)
if (s i<caret>nstanceof Integer) {
System.out.println();
}
return 1;
}
}

View File

@@ -0,0 +1,10 @@
// "Remove 'if' statement" "true"
class X {
int m(String s) {
if (s.equals("abc"))
if (s i<caret>nstanceof Integer) {
System.out.println();
}
return 1;
}
}