java/groovy completion: reference method overloads via smart pointers to avoid AST leaks

This commit is contained in:
peter
2015-07-21 09:53:37 +02:00
parent f92c2b1fd5
commit 81081c0ff3
5 changed files with 34 additions and 10 deletions
@@ -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<List<PsiMethod>> ALL_METHODS_ATTRIBUTE = Key.create("allMethods");
private static final Key<List<SmartPsiElementPointer<PsiMethod>>> 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<PsiMethod> methods) {
item.putUserData(ALL_METHODS_ATTRIBUTE, ContainerUtil.map(methods, new Function<PsiMethod, SmartPsiElementPointer<PsiMethod>>() {
@Override
public SmartPsiElementPointer<PsiMethod> fun(PsiMethod method) {
return SmartPointerManager.getInstance(method.getProject()).createSmartPsiElementPointer(method);
}
}));
}
public static List<PsiMethod> getAllMethods(LookupElement item) {
List<SmartPsiElementPointer<PsiMethod>> pointers = item.getUserData(ALL_METHODS_ATTRIBUTE);
if (pointers == null) return null;
return ContainerUtil.mapNotNull(pointers, new Function<SmartPsiElementPointer<PsiMethod>, PsiMethod>() {
@Override
public PsiMethod fun(SmartPsiElementPointer<PsiMethod> 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<? extends PsiElement> getAllPsiElements(final LookupElement item) {
List<PsiMethod> allMethods = item.getUserData(ALL_METHODS_ATTRIBUTE);
List<PsiMethod> allMethods = getAllMethods(item);
if (allMethods != null) return allMethods;
if (item.getObject() instanceof PsiElement) return Arrays.asList((PsiElement)item.getObject());
return null;
@@ -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));
@@ -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;
}
@@ -129,7 +129,7 @@ public class JavaElementLookupRenderer implements ElementLookupRenderer {
}
public static boolean isToStrikeout(LookupItem<?> item) {
final List<PsiMethod> allMethods = item.getUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE);
final List<PsiMethod> allMethods = JavaCompletionUtil.getAllMethods(item);
if (allMethods != null){
for (PsiMethod method : allMethods) {
if (!method.isValid()) { //?
@@ -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));
}