diff --git a/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java b/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java index f9f05f966adf..08830d2e9ace 100644 --- a/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java +++ b/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java @@ -91,6 +91,8 @@ public abstract class QuickFixFactory { @NotNull public abstract IntentionAction createSurroundWithTryCatchFix(@NotNull PsiElement element); + @NotNull public abstract IntentionAction createAddExceptionToExistingCatch(@NotNull PsiElement element); + @NotNull public abstract IntentionAction createGeneralizeCatchFix(@NotNull PsiElement element, @NotNull PsiClassType type); @NotNull public abstract IntentionAction createChangeToAppendFix(@NotNull IElementType sign, @NotNull PsiType type, @NotNull PsiAssignmentExpression assignment); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightFixUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightFixUtil.java index 5383c1b67a36..8ff0894074f3 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightFixUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightFixUtil.java @@ -195,6 +195,7 @@ public class HighlightFixUtil { QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createAddExceptionToThrowsFix(element)); QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createAddExceptionFromFieldInitializerToConstructorThrowsFix(element)); QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createSurroundWithTryCatchFix(element)); + QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createAddExceptionToExistingCatch(element)); if (unhandled.size() == 1) { QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createGeneralizeCatchFix(element, unhandled.get(0))); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/EmptyQuickFixFactory.java b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/EmptyQuickFixFactory.java index 24ef4229af80..ec11ca1123f4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/EmptyQuickFixFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/EmptyQuickFixFactory.java @@ -185,6 +185,10 @@ public class EmptyQuickFixFactory extends QuickFixFactory { return QuickFixes.EMPTY_FIX; } + @NotNull public IntentionAction createAddExceptionToExistingCatch(@NotNull PsiElement element) { + return QuickFixes.EMPTY_FIX; + } + @NotNull @Override public IntentionAction createGeneralizeCatchFix(@NotNull PsiElement psiElement, @NotNull PsiClassType psiClassType) { diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index ada72a53920d..36b6c51d7a74 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -1156,8 +1156,5 @@ com.intellij.codeInsight.intention.impl.SplitFilterAction Java/Streams - - com.intellij.codeInsight.intention.impl.AddExceptionToExistingCatchAction - \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddExceptionToExistingCatchAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToExistingCatchFix.java similarity index 92% rename from java/java-impl/src/com/intellij/codeInsight/intention/impl/AddExceptionToExistingCatchAction.java rename to java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToExistingCatchFix.java index 54a213f6486b..41998758b764 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddExceptionToExistingCatchAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToExistingCatchFix.java @@ -1,5 +1,5 @@ // 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.codeInsight.intention.impl; +package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.ExceptionUtil; import com.intellij.codeInsight.daemon.QuickFixBundle; @@ -24,14 +24,18 @@ import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; -public class AddExceptionToExistingCatchAction extends PsiElementBaseIntentionAction { +public class AddExceptionToExistingCatchFix extends PsiElementBaseIntentionAction { + private final PsiElement myErrorElement; + + public AddExceptionToExistingCatchFix(PsiElement errorElement) {myErrorElement = errorElement;} + @Override public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException { PsiTryStatement tryStatement = PsiTreeUtil.getParentOfType(element, PsiTryStatement.class); if (tryStatement == null) return; PsiCatchSection[] catchSections = tryStatement.getCatchSections(); if (catchSections.length == 0) return; - List unhandledExceptions = new ArrayList<>(ExceptionUtil.getOwnUnhandledExceptions(element)); + List unhandledExceptions = new ArrayList<>(ExceptionUtil.getOwnUnhandledExceptions(myErrorElement)); if (unhandledExceptions.size() != 1) return; List catchTexts = getAvailableCatchSections(catchSections) .map(s -> s.getCatchType()) @@ -96,8 +100,8 @@ public class AddExceptionToExistingCatchAction extends PsiElementBaseIntentionAc if (notFinishedCatches(catchSections)) return false; PsiElement parent = PsiTreeUtil.getParentOfType(element, PsiCallExpression.class, PsiThrowStatement.class); if (parent == null) return false; - List unhandledExceptions = new ArrayList<>(ExceptionUtil.collectUnhandledExceptions(tryStatement.getParent(), parent)); - return !unhandledExceptions.isEmpty(); + List unhandledExceptions = new ArrayList<>(ExceptionUtil.getOwnUnhandledExceptions(myErrorElement)); + return unhandledExceptions.size() == 1; } private static boolean notFinishedCatches(PsiCatchSection[] catchSections) { diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java index 8746ebce9a66..bdf8e5b1040d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java @@ -16,6 +16,7 @@ import com.intellij.codeInsight.daemon.quickFix.CreateFieldOrPropertyFix; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.IntentionManager; import com.intellij.codeInsight.intention.QuickFixFactory; +import com.intellij.codeInsight.daemon.impl.quickfix.AddExceptionToExistingCatchFix; import com.intellij.codeInsight.intention.impl.CreateClassInPackageInModuleFix; import com.intellij.codeInsight.intention.impl.ReplaceAssignmentWithComparisonFix; import com.intellij.codeInspection.*; @@ -227,6 +228,12 @@ public class QuickFixFactoryImpl extends QuickFixFactory { return new SurroundWithTryCatchFix(element); } + @NotNull + @Override + public IntentionAction createAddExceptionToExistingCatch(@NotNull PsiElement element) { + return new AddExceptionToExistingCatchFix(element); + } + @NotNull @Override public IntentionAction createGeneralizeCatchFix(@NotNull PsiElement element, @NotNull PsiClassType type) { diff --git a/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/after.java.template b/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/after.java.template deleted file mode 100644 index 62c5a478d26d..000000000000 --- a/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/after.java.template +++ /dev/null @@ -1,13 +0,0 @@ -class A extends Exception {} -class B extends A {} -class C extends A {} - -class Test { - public static void main(String[] args) { - try { - throw new A(); - } catch (A e) { - } catch (C e) { - } - } -} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/before.java.template b/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/before.java.template deleted file mode 100644 index 8e6b97c3e4b3..000000000000 --- a/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/before.java.template +++ /dev/null @@ -1,13 +0,0 @@ -class A extends Exception {} -class B extends A {} -class C extends A {} - -class Test { - public static void main(String[] args) { - try { - throw new A(); - } catch (B e) { - } catch (C e) { - } - } -} \ No newline at end of file diff --git a/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/description.html b/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/description.html deleted file mode 100644 index 39607fce2352..000000000000 --- a/java/java-impl/src/intentionDescriptions/AddExceptionToExistingCatchAction/description.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

Intention to add exception to existing catch clause

- - - \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addExceptionToExistingCatch/afterSimple.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addExceptionToExistingCatch/afterSingleCatch.java similarity index 100% rename from java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addExceptionToExistingCatch/afterSimple.java rename to java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addExceptionToExistingCatch/afterSingleCatch.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addExceptionToExistingCatch/beforeSimple.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addExceptionToExistingCatch/beforeSingleCatch.java similarity index 100% rename from java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addExceptionToExistingCatch/beforeSimple.java rename to java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addExceptionToExistingCatch/beforeSingleCatch.java