mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
cache LambdaUtil.findFunctionCandidates
This commit is contained in:
@@ -216,36 +216,46 @@ public class LambdaUtil {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static List<HierarchicalMethodSignature> findFunctionCandidates(PsiClass psiClass) {
|
||||
public static List<HierarchicalMethodSignature> findFunctionCandidates(final PsiClass psiClass) {
|
||||
if (psiClass != null && psiClass.isInterface() && !psiClass.isAnnotationType()) {
|
||||
final List<HierarchicalMethodSignature> methods = new ArrayList<HierarchicalMethodSignature>();
|
||||
final Map<MethodSignature, Set<PsiMethod>> overrideEquivalents = PsiSuperMethodUtil.collectOverrideEquivalents(psiClass);
|
||||
final Collection<HierarchicalMethodSignature> visibleSignatures = psiClass.getVisibleSignatures();
|
||||
for (HierarchicalMethodSignature signature : visibleSignatures) {
|
||||
final PsiMethod psiMethod = signature.getMethod();
|
||||
if (!psiMethod.hasModifierProperty(PsiModifier.ABSTRACT)) continue;
|
||||
if (psiMethod.hasModifierProperty(PsiModifier.STATIC)) continue;
|
||||
final Set<PsiMethod> equivalentMethods = overrideEquivalents.get(signature);
|
||||
if (equivalentMethods != null && equivalentMethods.size() > 1) {
|
||||
boolean hasNonAbstractOverrideEquivalent = false;
|
||||
for (PsiMethod method : equivalentMethods) {
|
||||
if (!method.hasModifierProperty(PsiModifier.ABSTRACT) && !MethodSignatureUtil.isSuperMethod(method, psiMethod)) {
|
||||
hasNonAbstractOverrideEquivalent = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasNonAbstractOverrideEquivalent) continue;
|
||||
return CachedValuesManager.getCachedValue(psiClass, new CachedValueProvider<List<HierarchicalMethodSignature>>() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Result<List<HierarchicalMethodSignature>> compute() {
|
||||
return Result.create(calcFunctionCandidates(psiClass), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT);
|
||||
}
|
||||
if (!overridesPublicObjectMethod(signature)) {
|
||||
methods.add(signature);
|
||||
}
|
||||
}
|
||||
|
||||
return hasSubsignature(methods);
|
||||
});
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static List<HierarchicalMethodSignature> calcFunctionCandidates(PsiClass psiClass) {
|
||||
final List<HierarchicalMethodSignature> methods = new ArrayList<HierarchicalMethodSignature>();
|
||||
final Map<MethodSignature, Set<PsiMethod>> overrideEquivalents = PsiSuperMethodUtil.collectOverrideEquivalents(psiClass);
|
||||
final Collection<HierarchicalMethodSignature> visibleSignatures = psiClass.getVisibleSignatures();
|
||||
for (HierarchicalMethodSignature signature : visibleSignatures) {
|
||||
final PsiMethod psiMethod = signature.getMethod();
|
||||
if (!psiMethod.hasModifierProperty(PsiModifier.ABSTRACT)) continue;
|
||||
if (psiMethod.hasModifierProperty(PsiModifier.STATIC)) continue;
|
||||
final Set<PsiMethod> equivalentMethods = overrideEquivalents.get(signature);
|
||||
if (equivalentMethods != null && equivalentMethods.size() > 1) {
|
||||
boolean hasNonAbstractOverrideEquivalent = false;
|
||||
for (PsiMethod method : equivalentMethods) {
|
||||
if (!method.hasModifierProperty(PsiModifier.ABSTRACT) && !MethodSignatureUtil.isSuperMethod(method, psiMethod)) {
|
||||
hasNonAbstractOverrideEquivalent = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasNonAbstractOverrideEquivalent) continue;
|
||||
}
|
||||
if (!overridesPublicObjectMethod(signature)) {
|
||||
methods.add(signature);
|
||||
}
|
||||
}
|
||||
|
||||
return hasSubsignature(methods);
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
private static PsiType getReturnType(PsiClass psiClass, MethodSignature methodSignature) {
|
||||
|
||||
Reference in New Issue
Block a user