diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/GeneralizeCatchFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/GeneralizeCatchFix.java index 57a5e7dcbdc0..33953721c035 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/GeneralizeCatchFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/GeneralizeCatchFix.java @@ -22,12 +22,11 @@ import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; public class GeneralizeCatchFix implements IntentionAction { -// private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.quickfix.DeleteCatchFix"); - private final PsiElement myElement; private final PsiClassType myUnhandledException; private PsiTryStatement myTryStatement; @@ -56,13 +55,11 @@ public class GeneralizeCatchFix implements IntentionAction { && myUnhandledException != null && myUnhandledException.isValid() && myElement.getManager().isInProject(myElement))) return false; - // final enclosing try + // find enclosing try PsiElement element = myElement; while (element != null) { - if (element instanceof PsiCodeBlock - && element.getParent() instanceof PsiTryStatement - && ((PsiTryStatement) element.getParent()).getTryBlock() == element) { - myTryStatement = (PsiTryStatement) element.getParent(); + if (PsiUtil.isTryBlock(element) || element instanceof PsiResourceList) { + myTryStatement = (PsiTryStatement)element.getParent(); break; } if (element instanceof PsiMethod || (element instanceof PsiClass && !(element instanceof PsiAnonymousClass))) break; @@ -91,5 +88,4 @@ public class GeneralizeCatchFix implements IntentionAction { public boolean startInWriteAction() { return true; } - } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/generalizeCatch/after3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/generalizeCatch/after3.java new file mode 100644 index 000000000000..156c244c4d4a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/generalizeCatch/after3.java @@ -0,0 +1,17 @@ +// "Generalize catch for 'C.E1' to 'C.E'" "true" +class C { + static class E extends Exception { } + static class E1 extends E { } + + static class MyResource implements AutoCloseable { + public MyResource() throws E1 { } + public void close() throws E { } + } + + void f() { + try (MyResource r = new MyResource()) { + } catch (E e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/generalizeCatch/before3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/generalizeCatch/before3.java new file mode 100644 index 000000000000..b1f0395c94e4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/generalizeCatch/before3.java @@ -0,0 +1,17 @@ +// "Generalize catch for 'C.E1' to 'C.E'" "true" +class C { + static class E extends Exception { } + static class E1 extends E { } + + static class MyResource implements AutoCloseable { + public MyResource() throws E1 { } + public void close() throws E { } + } + + void f() { + try (MyResource r = new MyResource()) { + } catch (E1 e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/GeneralizeCatchTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/GeneralizeCatchTest.java index d85e2badfaf4..08678c9b6733 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/GeneralizeCatchTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/GeneralizeCatchTest.java @@ -1,16 +1,12 @@ - package com.intellij.codeInsight.daemon.quickFix; - - public class GeneralizeCatchTest extends LightQuickFixTestCase { - - public void test() throws Exception { doAllTests(); } + public void test() throws Exception { + doAllTests(); + } @Override protected String getBasePath() { return "/codeInsight/daemonCodeAnalyzer/quickFix/generalizeCatch"; } - } - diff --git a/java/openapi/src/com/intellij/psi/util/PsiUtil.java b/java/openapi/src/com/intellij/psi/util/PsiUtil.java index cad1d2d9d1c3..d26afc76cf20 100644 --- a/java/openapi/src/com/intellij/psi/util/PsiUtil.java +++ b/java/openapi/src/com/intellij/psi/util/PsiUtil.java @@ -884,6 +884,14 @@ public final class PsiUtil extends PsiUtilBase { }; public static void setModifierProperty(@NotNull PsiModifierListOwner owner, @NotNull @Modifier String property, boolean value) { - owner.getModifierList().setModifierProperty(property, value); + final PsiModifierList modifierList = owner.getModifierList(); + assert modifierList != null : owner; + modifierList.setModifierProperty(property, value); + } + + public static boolean isTryBlock(final PsiElement element) { + return element instanceof PsiCodeBlock && + element.getParent() instanceof PsiTryStatement && + ((PsiTryStatement)element.getParent()).getTryBlock() == element; } }