summaryrefslogtreecommitdiff
path: root/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java
diff options
context:
space:
mode:
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.java43
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;
+ }
}