diff options
Diffstat (limited to 'java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java')
-rw-r--r-- | java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java | 43 |
1 files changed, 30 insertions, 13 deletions
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<PsiMethod> allMethods = new ArrayList<PsiMethod>(); 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; + } } |