diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SurroundWithTryCatchFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SurroundWithTryCatchFix.java index d617c8d67e88..e10b61610fce 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SurroundWithTryCatchFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SurroundWithTryCatchFix.java @@ -41,12 +41,10 @@ public class SurroundWithTryCatchFix implements IntentionAction { private PsiStatement myStatement = null; public SurroundWithTryCatchFix(@NotNull PsiElement element) { - final PsiMethodReferenceExpression methodReferenceExpression = PsiTreeUtil.getParentOfType(element, PsiMethodReferenceExpression.class, false); - if (methodReferenceExpression == null) { - final PsiLambdaExpression lambdaExpression = PsiTreeUtil.getParentOfType(element, PsiLambdaExpression.class); - if (lambdaExpression == null || lambdaExpression.getBody() instanceof PsiCodeBlock) { - myStatement = PsiTreeUtil.getNonStrictParentOfType(element, PsiStatement.class); - } + final PsiFunctionalExpression functionalExpression = PsiTreeUtil.getParentOfType(element, PsiFunctionalExpression.class, false); + if (functionalExpression == null || + (functionalExpression instanceof PsiLambdaExpression && ((PsiLambdaExpression)functionalExpression).getBody() instanceof PsiCodeBlock)) { + myStatement = PsiTreeUtil.getNonStrictParentOfType(element, PsiStatement.class); } } diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java index fb7f7653a16a..fa13a8a2dfdd 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java @@ -29,6 +29,7 @@ import com.intellij.psi.scope.MethodProcessorSetupFailedException; import com.intellij.psi.scope.processor.MethodResolverProcessor; import com.intellij.psi.scope.util.PsiScopesUtil; import com.intellij.psi.util.*; +import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.NullableFunction; import com.intellij.util.SmartList; @@ -346,7 +347,7 @@ public class ExceptionUtil { } @NotNull - public static List getUnhandledExceptions(@NotNull PsiElement[] elements) { + public static List getUnhandledExceptions(final @NotNull PsiElement[] elements) { final List array = ContainerUtil.newArrayList(); final PsiElementVisitor visitor = new JavaRecursiveElementWalkingVisitor() { @Override @@ -363,6 +364,7 @@ public class ExceptionUtil { @Override public void visitMethodReferenceExpression(@NotNull PsiMethodReferenceExpression expression) { + if (ArrayUtil.find(elements, expression) < 0) return; addExceptions(array, getUnhandledExceptions(expression, null)); visitElement(expression); } diff --git a/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundWithTryCatchFunctionalExpression.java b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundWithTryCatchFunctionalExpression.java new file mode 100644 index 000000000000..62fc5296f570 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundWithTryCatchFunctionalExpression.java @@ -0,0 +1,14 @@ +class Test { + + public static void main(String[] args){ + I i = ExceptionTest::foo; + } + + class Ex extends Exception {} + + static void foo() throws Ex {} + + interface I { + void f(); + } +} diff --git a/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundWithTryCatchFunctionalExpression_after.java b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundWithTryCatchFunctionalExpression_after.java new file mode 100644 index 000000000000..ae866e424956 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundWithTryCatchFunctionalExpression_after.java @@ -0,0 +1,18 @@ +class Test { + + public static void main(String[] args){ + try { + I i = ExceptionTest::foo; + } catch (Exception e) { + e.printStackTrace(); + } + } + + class Ex extends Exception {} + + static void foo() throws Ex {} + + interface I { + void f(); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/generation/surroundWith/JavaSurroundWithTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/generation/surroundWith/JavaSurroundWithTest.java index 8bd53fdabfbf..c4dce5fd134b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/generation/surroundWith/JavaSurroundWithTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/generation/surroundWith/JavaSurroundWithTest.java @@ -170,6 +170,10 @@ public class JavaSurroundWithTest extends LightCodeInsightTestCase { } } + public void testSurroundWithTryCatchFunctionalExpression() { + doTest(getTestName(false), new JavaWithTryCatchSurrounder()); + } + private void doTest(@NotNull String fileName, final Surrounder surrounder) { configureByFile(BASE_PATH + fileName + ".java");