IDEA-67190 (correctly unwrap try statement if it's not in a code block)

This commit is contained in:
Roman Shevchenko
2011-03-29 15:26:34 +02:00
parent 02d71b0230
commit 5d95c304c6
3 changed files with 66 additions and 41 deletions

View File

@@ -15,20 +15,16 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
public class DeleteCatchFix implements IntentionAction {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.quickfix.DeleteCatchFix");
private final PsiParameter myCatchParameter;
public DeleteCatchFix(PsiParameter myCatchParameter) {
@@ -53,50 +49,55 @@ public class DeleteCatchFix implements IntentionAction {
public void invoke(@NotNull Project project, Editor editor, PsiFile file) {
if (!CodeInsightUtilBase.prepareFileForWrite(myCatchParameter.getContainingFile())) return;
try {
PsiTryStatement tryStatement = ((PsiCatchSection)myCatchParameter.getDeclarationScope()).getTryStatement();
PsiElement tryParent = tryStatement.getParent();
if (tryStatement.getCatchBlocks().length == 1 && tryStatement.getFinallyBlock() == null) {
PsiCodeBlock tryBlock = tryStatement.getTryBlock();
PsiElement firstElement = tryBlock.getFirstBodyElement();
PsiElement lastAddedStatement = null;
final PsiTryStatement tryStatement = ((PsiCatchSection)myCatchParameter.getDeclarationScope()).getTryStatement();
if (tryStatement.getCatchBlocks().length == 1 && tryStatement.getFinallyBlock() == null) {
// unwrap entire try statement
final PsiCodeBlock tryBlock = tryStatement.getTryBlock();
PsiElement lastAddedStatement = null;
if (tryBlock != null) {
final PsiElement firstElement = tryBlock.getFirstBodyElement();
if (firstElement != null) {
PsiElement endElement = tryBlock.getLastBodyElement();
tryParent.addRangeBefore(firstElement, endElement, tryStatement);
lastAddedStatement = tryStatement.getPrevSibling();
while (lastAddedStatement != null && (lastAddedStatement instanceof PsiWhiteSpace || lastAddedStatement.getTextLength() == 0)) {
lastAddedStatement = lastAddedStatement.getPrevSibling();
}
final PsiElement tryParent = tryStatement.getParent();
if (tryParent instanceof PsiCodeBlock) {
final PsiElement lastBodyElement = tryBlock.getLastBodyElement();
assert lastBodyElement != null : tryBlock.getText();
tryParent.addRangeBefore(firstElement, lastBodyElement, tryStatement);
lastAddedStatement = tryStatement.getPrevSibling();
while (lastAddedStatement != null && (lastAddedStatement instanceof PsiWhiteSpace || lastAddedStatement.getTextLength() == 0)) {
lastAddedStatement = lastAddedStatement.getPrevSibling();
}
}
else {
tryParent.addBefore(tryBlock, tryStatement);
lastAddedStatement = tryBlock;
}
}
tryStatement.delete();
if (lastAddedStatement != null) {
editor.getCaretModel().moveToOffset(lastAddedStatement.getTextRange().getEndOffset());
}
return;
}
tryStatement.delete();
if (lastAddedStatement != null) {
editor.getCaretModel().moveToOffset(lastAddedStatement.getTextRange().getEndOffset());
}
// delete catch section
LOG.assertTrue(myCatchParameter.getParent() instanceof PsiCatchSection);
final PsiElement catchSection = myCatchParameter.getParent();
//save previous element to move caret to
PsiElement previousElement = catchSection.getPrevSibling();
while (previousElement instanceof PsiWhiteSpace) {
previousElement = previousElement.getPrevSibling();
}
catchSection.delete();
if (previousElement != null) {
//move caret to previous catch section
editor.getCaretModel().moveToOffset(previousElement.getTextRange().getEndOffset());
}
} catch (IncorrectOperationException e) {
LOG.error(e);
return;
}
// delete catch section
final PsiElement catchSection = myCatchParameter.getParent();
assert catchSection instanceof PsiCatchSection : catchSection;
//save previous element to move caret to
PsiElement previousElement = catchSection.getPrevSibling();
while (previousElement instanceof PsiWhiteSpace) {
previousElement = previousElement.getPrevSibling();
}
catchSection.delete();
if (previousElement != null) {
//move caret to previous catch section
editor.getCaretModel().moveToOffset(previousElement.getTextRange().getEndOffset());
}
}
public boolean startInWriteAction() {
return true;
}
}

View File

@@ -0,0 +1,11 @@
// "Delete catch for 'java.io.IOException'" "true"
import java.io.*;
class a {
void f(boolean f) {
if (f) {
System.out.println();
System.out.println();
}
}
}

View File

@@ -0,0 +1,13 @@
// "Delete catch for 'java.io.IOException'" "true"
import java.io.*;
class a {
void f(boolean f) {
if (f)
try {
System.out.println();
System.out.println();
} catch (<caret>IOException e) {
}
}
}