From 80806675442a0c2a46b2a2754dcc9b946c802dae Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 6 Apr 2011 18:40:35 +0200 Subject: [PATCH] don't suggest void methods in a context where some return value is expected (suggest on second invocation) --- .../completion/JavaCompletionContributor.java | 7 +++++++ .../completion/normal/DoubleFalse.java | 2 ++ .../normal/VoidMethodsInNonVoidContext.java | 5 +++++ .../VoidMethodsInNonVoidContext_after.java | 5 +++++ .../completion/normalSorting/ReturnF.java | 2 +- .../NormalCompletionOrderingTest.java | 7 +++++-- .../completion/NormalCompletionTest.groovy | 18 +++++++++++++----- 7 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/VoidMethodsInNonVoidContext.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/VoidMethodsInNonVoidContext_after.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 6157ab88a59a..a63b81fe9e5e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -247,6 +247,8 @@ public class JavaCompletionContributor extends CompletionContributor { if (reference instanceof PsiJavaReference) { final ElementFilter filter = getReferenceFilter(position); if (filter != null) { + boolean filterVoid = JavaSmartCompletionContributor.getExpectedTypes(parameters).length > 0 && parameters.getInvocationCount() < 2; + final boolean isSwitchLabel = SWITCH_LABEL.accepts(position); final PsiFile originalFile = parameters.getOriginalFile(); for (LookupElement element : JavaCompletionUtil.processJavaReference(position, @@ -268,6 +270,11 @@ public class JavaCompletionContributor extends CompletionContributor { item.setTailType(TailType.NONE); } + Object object = element.getObject(); + if (filterVoid && object instanceof PsiMethod && PsiType.VOID.equals(((PsiMethod)object).getReturnType())) { + continue; + } + result.addElement(element); } } diff --git a/java/java-tests/testData/codeInsight/completion/normal/DoubleFalse.java b/java/java-tests/testData/codeInsight/completion/normal/DoubleFalse.java index a1a631e5f032..eeae2718b36c 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/DoubleFalse.java +++ b/java/java-tests/testData/codeInsight/completion/normal/DoubleFalse.java @@ -8,4 +8,6 @@ public class Foo { }); } + boolean fefefef() {} + } diff --git a/java/java-tests/testData/codeInsight/completion/normal/VoidMethodsInNonVoidContext.java b/java/java-tests/testData/codeInsight/completion/normal/VoidMethodsInNonVoidContext.java new file mode 100644 index 000000000000..b0564b6e4878 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/VoidMethodsInNonVoidContext.java @@ -0,0 +1,5 @@ +public class Foo { + Object foo(){ + return noti + } +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/VoidMethodsInNonVoidContext_after.java b/java/java-tests/testData/codeInsight/completion/normal/VoidMethodsInNonVoidContext_after.java new file mode 100644 index 000000000000..6e1389582825 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/VoidMethodsInNonVoidContext_after.java @@ -0,0 +1,5 @@ +public class Foo { + Object foo(){ + return notify + } +} diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/ReturnF.java b/java/java-tests/testData/codeInsight/completion/normalSorting/ReturnF.java index 842b8fd3c3d2..065a361e1098 100644 --- a/java/java-tests/testData/codeInsight/completion/normalSorting/ReturnF.java +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/ReturnF.java @@ -1,5 +1,5 @@ class Foo { boolean zoo(String s) { - return f + return fx } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java index 01d60d2af9c2..69de8cb40eaa 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java @@ -46,7 +46,7 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { } public void testReturnF() throws Throwable { - checkPreferredItems(0, "false", "finalize"); + checkPreferredItems(0, "false"); } public void testPreferDefaultTypeToExpected() throws Throwable { @@ -84,7 +84,10 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { } public void testClassStaticMembersInBooleanContext() throws Throwable { - checkPreferredItems(0, "booleanMethod", "voidMethod", "BOOLEAN", "AN_OBJECT", "class"); + final String path = getTestName(false) + ".java"; + myFixture.configureByFile(path); + myFixture.complete(CompletionType.BASIC, 2); + assertPreferredItems(0, "booleanMethod", "voidMethod", "registerNatives", "BOOLEAN", "AN_OBJECT"); } public void testDispreferDeclared() throws Throwable { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index ce92618fb7dc..17ada288cc3e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -5,6 +5,7 @@ import com.intellij.JavaTestUtil import com.intellij.codeInsight.CodeInsightSettings import com.intellij.codeInsight.lookup.Lookup import com.intellij.codeInsight.lookup.LookupElement +import com.intellij.codeInsight.lookup.LookupElementPresentation import com.intellij.codeInsight.lookup.LookupManager import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.fileTypes.StdFileTypes @@ -14,7 +15,6 @@ import com.intellij.psi.PsiFile import com.intellij.psi.PsiMethod import com.intellij.psi.codeStyle.CodeStyleSettings import com.intellij.psi.codeStyle.CodeStyleSettingsManager -import com.intellij.codeInsight.lookup.LookupElementPresentation public class NormalCompletionTest extends LightFixtureCompletionTestCase { @Override @@ -677,7 +677,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { public void testDoubleFalse() throws Throwable { configureByFile(getTestName(false) + ".java"); - assertStringItems("false", "finalize"); + assertStringItems("false", "fefefef"); } public void testSameNamedVariableInNestedClasses() throws Throwable { @@ -822,6 +822,16 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { public void testMethodParameterAnnotationClass() throws Throwable { doTest(); } + public void testVoidMethodsInNonVoidContext() throws Throwable { + configure() + checkResultByFile(getTestName(false) + ".java") + assertEmpty(myItems) + assertNull(getLookup()); + + myFixture.complete(CompletionType.BASIC, 2) + checkResult() + } + public void testEnumConstantFromEnumMember() throws Throwable { doTest(); } public void testPrimitiveMethodParameter() throws Throwable { doTest(); } @@ -892,9 +902,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { } public void testClassNameInsideIdentifierInIf() throws Throwable { - configure() - type '\n' - checkResult() + doTest '\n' } public void testSuggestMembersOfStaticallyImportedClasses() throws Exception {