From b2a2f143c2bd3fe5645b03b115cb7f1813d31c15 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 25 Jul 2012 15:35:58 +0200 Subject: [PATCH] make intention work on nested try statement without resource lists --- .../MergeNestedTryStatementsIntention.java | 43 +++++++++++++------ .../NestedTryStatementsPredicate.java | 16 ++----- .../ipp/exceptions/mergeTry/OldStyle.java | 19 ++++++++ .../exceptions/mergeTry/OldStyle_after.java | 17 ++++++++ ...MergeNestedTryStatementsIntentionTest.java | 1 + 5 files changed, 69 insertions(+), 27 deletions(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/exceptions/mergeTry/OldStyle.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/exceptions/mergeTry/OldStyle_after.java diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/exceptions/MergeNestedTryStatementsIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/exceptions/MergeNestedTryStatementsIntention.java index 612bb75fdc2c..f5b5344b032c 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/exceptions/MergeNestedTryStatementsIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/exceptions/MergeNestedTryStatementsIntention.java @@ -37,10 +37,13 @@ public class MergeNestedTryStatementsIntention extends Intention { @Override protected void processIntention(@NotNull PsiElement element) throws IncorrectOperationException { final PsiTryStatement tryStatement1 = (PsiTryStatement)element.getParent(); - final StringBuilder newTryStatement = new StringBuilder("try ("); + final StringBuilder newTryStatement = new StringBuilder("try "); final PsiResourceList list1 = tryStatement1.getResourceList(); boolean semicolon = false; + boolean resourceList = false; if (list1 != null) { + resourceList = true; + newTryStatement.append('('); final List variables1 = list1.getResourceVariables(); for (PsiResourceVariable variable : variables1) { if (semicolon) { @@ -57,29 +60,41 @@ public class MergeNestedTryStatementsIntention extends Intention { return; } final PsiStatement[] statements = tryBlock1.getStatements(); - final PsiTryStatement tryStatement2 = (PsiTryStatement)statements[0]; - final PsiResourceList list2 = tryStatement2.getResourceList(); - if (list2 == null) { + if (statements.length != 1) { return; } - final List variables2 = list2.getResourceVariables(); - for (PsiResourceVariable variable : variables2) { - if (semicolon) { - newTryStatement.append(';'); + final PsiTryStatement tryStatement2 = (PsiTryStatement)statements[0]; + final PsiResourceList list2 = tryStatement2.getResourceList(); + if (list2 != null) { + if (!resourceList) { + newTryStatement.append('('); } - else { - semicolon = true; + resourceList = true; + final List variables2 = list2.getResourceVariables(); + for (PsiResourceVariable variable : variables2) { + if (semicolon) { + newTryStatement.append(';'); + } + else { + semicolon = true; + } + newTryStatement.append(variable.getText()); } - newTryStatement.append(variable.getText()); } - newTryStatement.append(")"); + if (resourceList) { + newTryStatement.append(")"); + } final PsiCodeBlock tryBlock2 = tryStatement2.getTryBlock(); if (tryBlock2 == null) { return; } newTryStatement.append(tryBlock2.getText()); - final PsiCatchSection[] catchSections = tryStatement1.getCatchSections(); - for (PsiCatchSection section : catchSections) { + final PsiCatchSection[] catchSections2 = tryStatement2.getCatchSections(); + for (PsiCatchSection section : catchSections2) { + newTryStatement.append(section.getText()); + } + final PsiCatchSection[] catchSections1 = tryStatement1.getCatchSections(); + for (PsiCatchSection section : catchSections1) { newTryStatement.append(section.getText()); } final PsiElementFactory factory = JavaPsiFacade.getElementFactory(element.getProject()); diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/exceptions/NestedTryStatementsPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/exceptions/NestedTryStatementsPredicate.java index 4b0c47da4480..5f549d4f3cea 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/exceptions/NestedTryStatementsPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/exceptions/NestedTryStatementsPredicate.java @@ -35,7 +35,7 @@ class NestedTryStatementsPredicate implements PsiElementPredicate { return false; } final PsiElement parent = element.getParent(); - if (!isSimpleTry(parent, false)) { + if (!isSimpleTry(parent)) { return false; } final PsiTryStatement tryStatement = (PsiTryStatement)parent; @@ -48,24 +48,14 @@ class NestedTryStatementsPredicate implements PsiElementPredicate { return false; } final PsiStatement statement = statements[0]; - return isSimpleTry(statement, true); + return isSimpleTry(statement); } - private static boolean isSimpleTry(PsiElement element, boolean withResources) { + private static boolean isSimpleTry(PsiElement element) { if (!(element instanceof PsiTryStatement)) { return false; } final PsiTryStatement tryStatement = (PsiTryStatement)element; - if (withResources) { - final PsiResourceList resourceList = tryStatement.getResourceList(); - if (resourceList == null) { - return false; - } - final PsiCatchSection[] sections = tryStatement.getCatchSections(); - if (sections.length != 0) { - return false; - } - } final PsiCodeBlock finallyBlock = tryStatement.getFinallyBlock(); if (finallyBlock != null) { return false; diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/exceptions/mergeTry/OldStyle.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/exceptions/mergeTry/OldStyle.java new file mode 100644 index 000000000000..d6e9600d64e2 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/exceptions/mergeTry/OldStyle.java @@ -0,0 +1,19 @@ +package com.siyeh.ipp.exceptions.mergeTry; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +class OldStyle { + void foo(File file1) { + try { + try { + FileInputStream in = new FileInputStream(file1); + } catch (FileNotFoundException e) { + // log + } + } catch (Exception e) { + // log + } + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/exceptions/mergeTry/OldStyle_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/exceptions/mergeTry/OldStyle_after.java new file mode 100644 index 000000000000..062cf0bb0674 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/exceptions/mergeTry/OldStyle_after.java @@ -0,0 +1,17 @@ +package com.siyeh.ipp.exceptions.mergeTry; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +class OldStyle { + void foo(File file1) { + try { + FileInputStream in = new FileInputStream(file1); + } catch (FileNotFoundException e) { + // log + } catch (Exception e) { + // log + } + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/exceptions/MergeNestedTryStatementsIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/exceptions/MergeNestedTryStatementsIntentionTest.java index 070a90ecbcc3..958ba766faab 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/exceptions/MergeNestedTryStatementsIntentionTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/exceptions/MergeNestedTryStatementsIntentionTest.java @@ -10,6 +10,7 @@ public class MergeNestedTryStatementsIntentionTest extends IPPTestCase { public void testSimple() { doTest(); } public void testWithoutAndWithResources() { doTest(); } + public void testOldStyle() { doTest(); } @Override protected String getIntentionName() {