diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java index 645aac0e78f7..b60094ffbd6f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.completion; +import com.intellij.codeInsight.ExceptionUtil; import com.intellij.codeInsight.completion.scope.JavaCompletionProcessor; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementWeigher; @@ -29,8 +30,10 @@ import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.proximity.KnownElementWeigher; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Set; import static com.intellij.patterns.PsiJavaPatterns.psiElement; @@ -69,10 +72,32 @@ public class PreferByKindWeigher extends LookupElementWeigher { } private static Condition createSuitabilityCondition(final PsiElement position) { - if (IN_CATCH_TYPE.accepts(position) || - IN_MULTI_CATCH_TYPE.accepts(position) || - JavaSmartCompletionContributor.AFTER_THROW_NEW.accepts(position) || - INSIDE_METHOD_THROWS_CLAUSE.accepts(position)) { + if (IN_CATCH_TYPE.accepts(position) || IN_MULTI_CATCH_TYPE.accepts(position)) { + PsiTryStatement tryStatement = PsiTreeUtil.getParentOfType(position, PsiTryStatement.class); + final List thrownExceptions = ContainerUtil.newArrayList(); + if (tryStatement != null && tryStatement.getTryBlock() != null) { + for (PsiClassType type : ExceptionUtil.getThrownExceptions(tryStatement.getTryBlock())) { + ContainerUtil.addIfNotNull(thrownExceptions, type.resolve()); + } + } + if (thrownExceptions.isEmpty()) { + ContainerUtil.addIfNotNull(thrownExceptions, + JavaPsiFacade.getInstance(position.getProject()).findClass( + CommonClassNames.JAVA_LANG_THROWABLE, position.getResolveScope())); + } + return new Condition() { + @Override + public boolean value(PsiClass psiClass) { + for (PsiClass exception : thrownExceptions) { + if (InheritanceUtil.isInheritorOrSelf(psiClass, exception, true)) { + return true; + } + } + return false; + } + }; + } + else if (JavaSmartCompletionContributor.AFTER_THROW_NEW.accepts(position) || INSIDE_METHOD_THROWS_CLAUSE.accepts(position)) { return new Condition() { @Override public boolean value(PsiClass psiClass) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java index 60cb54cefe6b..55b760031646 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java @@ -882,7 +882,7 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme if (superParent instanceof PsiCodeBlock || superParent instanceof PsiLocalVariable) { return true; } - if (superParent instanceof PsiClass) { + if (superParent instanceof PsiClass || superParent instanceof PsiCatchSection) { return false; } superParent = superParent.getParent(); diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferThrownExceptionsInCatch.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferThrownExceptionsInCatch.java new file mode 100644 index 000000000000..c1d412270715 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferThrownExceptionsInCatch.java @@ -0,0 +1,15 @@ +import java.io.*; + +class Foo { + { + try { + foo(); + } catch () + } + + private void foo() throws FileNotFoundException { + } + + private void bar() throws ArrayIndexOutOfBoundsException { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy index 5ef3eddcb39e..b9abb4fc9170 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -637,6 +637,10 @@ interface TxANotAnno {} checkPreferredItems 0, 'Deprecated', 'Override' } + public void testPreferThrownExceptionsInCatch() { + checkPreferredItems 0, 'FileNotFoundException', 'File' + } + public void testGlobalStaticMemberStats() { configureNoCompletion(getTestName(false) + ".java") myFixture.complete(CompletionType.BASIC, 2)