diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java index b409014c1fe8..661d0abfcaac 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java @@ -18,11 +18,14 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.psi.PsiMethod; -import com.intellij.psi.ResolveResult; +import com.intellij.psi.PsiType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import static com.intellij.util.ObjectUtils.assertNotNull; + /** * @author peter */ @@ -38,13 +41,9 @@ public class JavaMethodMergingContributor extends CompletionContributor { final LookupElement[] items = context.getItems(); if (items.length > 1) { String commonName = null; - LookupElement best = null; final ArrayList allMethods = new ArrayList(); for (LookupElement item : items) { - Object o = item.getObject(); - if (o instanceof ResolveResult) { - o = ((ResolveResult)o).getElement(); - } + Object o = item.getPsiElement(); if (item.getUserData(LookupItem.FORCE_SHOW_SIGNATURE_ATTR) != null || !(o instanceof PsiMethod)) { return AutoCompletionDecision.SHOW_LOOKUP; } @@ -56,19 +55,37 @@ public class JavaMethodMergingContributor extends CompletionContributor { return AutoCompletionDecision.SHOW_LOOKUP; } - if (best == null && method.getParameterList().getParametersCount() > 0) { - best = item; - } commonName = name; allMethods.add(method); item.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, allMethods); } - if (best == null) { - best = items[0]; - } - return AutoCompletionDecision.insertItem(best); + + return AutoCompletionDecision.insertItem(findBestOverload(items)); } return super.handleAutoCompletionPossibility(context); } + + public static LookupElement findBestOverload(LookupElement[] items) { + LookupElement best = items[0]; + for (int i = 1; i < items.length; i++) { + LookupElement item = items[i]; + if (getPriority(best) < getPriority(item)) { + best = item; + } + } + return best; + } + + private static int getPriority(LookupElement element) { + PsiMethod method = assertNotNull(getItemMethod(element)); + return (method.getReturnType() == PsiType.VOID ? 0 : 1) + + (method.getParameterList().getParametersCount() > 0 ? 2 : 0); + } + + @Nullable + private static PsiMethod getItemMethod(LookupElement item) { + Object o = item.getPsiElement(); + return o instanceof PsiMethod ? (PsiMethod)o : null; + } } diff --git a/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail.java b/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail.java new file mode 100644 index 000000000000..aa5945895222 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail.java @@ -0,0 +1,7 @@ +class Foo { + { + foo("someTestAttachment", "".getByt) + } + + void foo(String s, byte[] z) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail_after.java b/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail_after.java new file mode 100644 index 000000000000..a89e601edec6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/MethodMergingMinimalTail_after.java @@ -0,0 +1,7 @@ +class Foo { + { + foo("someTestAttachment", "".getBytes()) + } + + void foo(String s, byte[] z) {} +} \ No newline at end of file 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 acd6bca0341f..23b0cf3978ad 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -768,6 +768,8 @@ public class ListUtils { assertStringItems("fofoo", "fofoo"); } + public void testMethodMergingMinimalTail() { doTest() } + public void testAnnotationQualifiedName() throws Throwable { doTest(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java index e84361b0f57d..2c05dd7a3589 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java @@ -21,7 +21,6 @@ import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiParameter; import com.intellij.psi.PsiType; -import com.intellij.psi.ResolveResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames; @@ -46,13 +45,9 @@ public class GrMethodMergingContributor extends CompletionContributor { final LookupElement[] items = context.getItems(); if (items.length > 1) { String commonName = null; - LookupElement best = null; final ArrayList allMethods = new ArrayList(); for (LookupElement item : items) { - Object o = item.getObject(); - if (o instanceof ResolveResult) { - o = ((ResolveResult)o).getElement(); - } + Object o = item.getPsiElement(); if (item.getUserData(LookupItem.FORCE_SHOW_SIGNATURE_ATTR) != null || !(o instanceof PsiMethod)) { return AutoCompletionDecision.SHOW_LOOKUP; } @@ -76,17 +71,11 @@ public class GrMethodMergingContributor extends CompletionContributor { return AutoCompletionDecision.SHOW_LOOKUP; } - if (best == null && method.getParameterList().getParametersCount() > 0) { - best = item; - } commonName = name; allMethods.add(method); item.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, allMethods); } - if (best == null) { - best = items[0]; - } - return AutoCompletionDecision.insertItem(best); + return AutoCompletionDecision.insertItem(JavaMethodMergingContributor.findBestOverload(items)); } return super.handleAutoCompletionPossibility(context);