mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
java/groovy completion: reference method overloads via smart pointers to avoid AST leaks
This commit is contained in:
@@ -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;
|
||||
|
||||
+4
-1
@@ -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));
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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()) { //?
|
||||
|
||||
+4
-1
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user