From 96431dd854a29fa2aa6d0c15289d499710964433 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 6 Nov 2015 11:51:14 +0100 Subject: [PATCH] IDEA-147454 Smart completion add parentheses to class declaration in throws statement --- .../JavaSmartCompletionContributor.java | 21 ++++++++++++------- .../smartType/MethodThrows-out.java | 10 +++++++++ .../completion/smartType/MethodThrows.java | 10 +++++++++ .../completion/SmartTypeCompletionTest.java | 2 ++ 4 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/MethodThrows-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/MethodThrows.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index d181a34e6358..85d45e784f15 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -85,12 +85,6 @@ public class JavaSmartCompletionContributor extends CompletionContributor { return THROWABLES_FILTER; } - //throws list - PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class); - if (method != null && PsiTreeUtil.isAncestor(method.getThrowsList(), element, true)) { - return THROWABLES_FILTER; - } - //new xxx.yyy if (psiElement().afterLeaf(psiElement().withText(".")).withSuperParent(2, psiElement(PsiNewExpression.class)).accepts(element)) { if (((PsiNewExpression)element.getParent().getParent()).getClassReference() == element.getParent()) { @@ -107,6 +101,10 @@ public class JavaSmartCompletionContributor extends CompletionContributor { return null; } + private static boolean isInsideThrowsList(PsiElement element) { + PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class); + return method != null && PsiTreeUtil.isAncestor(method.getThrowsList(), element, true); + } public JavaSmartCompletionContributor() { @@ -128,11 +126,18 @@ public class JavaSmartCompletionContributor extends CompletionContributor { PsiTreeUtil.findElementOfClassAtOffset(element.getContainingFile(), parameters.getOffset(), PsiJavaCodeReferenceElement.class, false); if (reference != null) { ElementFilter filter = getClassReferenceFilter(element); + boolean completeConstructor = filter != null; + if (filter == null && isInsideThrowsList(element)) { + filter = THROWABLES_FILTER; + } if (filter != null) { final List infos = Arrays.asList(getExpectedTypes(parameters)); - for (final LookupElement item : completeReference(element, reference, filter, true, false, parameters, result.getPrefixMatcher())) { + for (LookupElement item : completeReference(element, reference, filter, true, false, parameters, result.getPrefixMatcher())) { if (item.getObject() instanceof PsiClass) { - result.addElement(decorate(LookupElementDecorator.withInsertHandler(item, ConstructorInsertHandler.SMART_INSTANCE), infos)); + if (completeConstructor) { + item = LookupElementDecorator.withInsertHandler(item, ConstructorInsertHandler.SMART_INSTANCE); + } + result.addElement(decorate(item, infos)); } } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/MethodThrows-out.java b/java/java-tests/testData/codeInsight/completion/smartType/MethodThrows-out.java new file mode 100644 index 000000000000..752a63dcd6d2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/MethodThrows-out.java @@ -0,0 +1,10 @@ +class FirstException extends Exception {} +class SecondException extends Exception {} + +interface I { + void method() throws FirstException, SecondException; +} + +class C implements I { + void method() throws FirstException, SecondException; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/MethodThrows.java b/java/java-tests/testData/codeInsight/completion/smartType/MethodThrows.java new file mode 100644 index 000000000000..d5332958a36e --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/MethodThrows.java @@ -0,0 +1,10 @@ +class FirstException extends Exception {} +class SecondException extends Exception {} + +interface I { + void method() throws FirstException, SecondException; +} + +class C implements I { + void method() throws FirstException, Sec; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java index e45a9866d2c9..a48109935ecf 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -428,6 +428,8 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { public void testJavadocThrows() throws Throwable { doTest(); } + public void testMethodThrows() throws Throwable { doTest(); } + public void testDoNotExcludeAssignedVariable() throws Throwable { doTest(); } public void testArrayIndexTailType() throws Throwable { doTest(); }