diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 970dc0459783..013629b36feb 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -50,10 +50,7 @@ import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.scope.util.PsiScopesUtil; import com.intellij.psi.util.*; import com.intellij.ui.JBColor; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.NullableFunction; -import com.intellij.util.PairConsumer; -import com.intellij.util.PairFunction; +import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.psiutils.SideEffectChecker; import gnu.trove.THashSet; @@ -102,7 +99,7 @@ public class JavaCompletionUtil { return null; } - public static final Key> ALL_METHODS_ATTRIBUTE = Key.create("allMethods"); + private static final Key>> ALL_METHODS_ATTRIBUTE = Key.create("allMethods"); public static PsiType getQualifierType(LookupItem item) { return item.getUserData(QUALIFIER_TYPE_ATTR); @@ -113,6 +110,27 @@ public class JavaCompletionUtil { JavaMemberNameCompletionContributor.completeVariableNameForRefactoring(project, set, camelHumpMatcher, varType, varKind, true, false); } + public static void putAllMethods(LookupElement item, List methods) { + item.putUserData(ALL_METHODS_ATTRIBUTE, ContainerUtil.map(methods, new Function>() { + @Override + public SmartPsiElementPointer fun(PsiMethod method) { + return SmartPointerManager.getInstance(method.getProject()).createSmartPsiElementPointer(method); + } + })); + } + + public static List getAllMethods(LookupElement item) { + List> pointers = item.getUserData(ALL_METHODS_ATTRIBUTE); + if (pointers == null) return null; + + return ContainerUtil.mapNotNull(pointers, new Function, PsiMethod>() { + @Override + public PsiMethod fun(SmartPsiElementPointer pointer) { + return pointer.getElement(); + } + }); + } + public static String[] completeVariableNameForRefactoring(JavaCodeStyleManager codeStyleManager, @Nullable final PsiType varType, final VariableKind varKind, SuggestedNameInfo suggestedNameInfo) { @@ -220,7 +238,7 @@ public class JavaCompletionUtil { @Nullable public static List getAllPsiElements(final LookupElement item) { - List allMethods = item.getUserData(ALL_METHODS_ATTRIBUTE); + List allMethods = getAllMethods(item); if (allMethods != null) return allMethods; if (item.getObject() instanceof PsiElement) return Arrays.asList((PsiElement)item.getObject()); return null; 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 661d0abfcaac..29fd7ee5c09f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java @@ -57,7 +57,10 @@ public class JavaMethodMergingContributor extends CompletionContributor { commonName = name; allMethods.add(method); - item.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, allMethods); + } + + for (LookupElement item : items) { + JavaCompletionUtil.putAllMethods(item, allMethods); } return AutoCompletionDecision.insertItem(findBestOverload(items)); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaStaticMemberProcessor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaStaticMemberProcessor.java index 432011d72b70..e0305c48bda2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaStaticMemberProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaStaticMemberProcessor.java @@ -71,7 +71,7 @@ public class JavaStaticMemberProcessor extends StaticMemberProcessor { shouldImport |= myOriginalPosition != null && PsiTreeUtil.isAncestor(containingClass, myOriginalPosition, false); final JavaMethodCallElement element = new GlobalMethodCallElement(overloads.get(0), shouldImport, true); - element.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, overloads); + JavaCompletionUtil.putAllMethods(element, overloads); return element; } diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/impl/JavaElementLookupRenderer.java b/java/java-impl/src/com/intellij/codeInsight/lookup/impl/JavaElementLookupRenderer.java index 09a952fa08ee..bf64fce02a79 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/impl/JavaElementLookupRenderer.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/impl/JavaElementLookupRenderer.java @@ -129,7 +129,7 @@ public class JavaElementLookupRenderer implements ElementLookupRenderer { } public static boolean isToStrikeout(LookupItem item) { - final List allMethods = item.getUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE); + final List allMethods = JavaCompletionUtil.getAllMethods(item); if (allMethods != null){ for (PsiMethod method : allMethods) { if (!method.isValid()) { //? 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 2c05dd7a3589..365d88573313 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 @@ -73,8 +73,11 @@ public class GrMethodMergingContributor extends CompletionContributor { commonName = name; allMethods.add(method); - item.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, allMethods); } + for (LookupElement item : items) { + JavaCompletionUtil.putAllMethods(item, allMethods); + } + return AutoCompletionDecision.insertItem(JavaMethodMergingContributor.findBestOverload(items)); }