Result (@NotNull LookupElement element) { final Object object = element.getObject(); if (!(object instanceof PsiMethod || object instanceof PsiVariable || object instanceof PsiExpression)) return Result.normal; if (myFilter != null && !myFilter.isAcceptable(object, myPosition)) { return Result.recursive; } if (isPassingObjectToItself(((PsiElement)object)) && myCompletionType == CompletionType.SMART) { return Result.passingObjectToItself; } if (myExpectedInfos != null) { final PsiType itemType = JavaCompletionUtil.getLookupElementType(element); if (itemType != null) { boolean hasRecursiveInvocations = false; boolean hasOtherInvocations = false; for (final ExpectedTypeInfo expectedInfo : myExpectedInfos) { PsiMethod calledMethod = expectedInfo.getCalledMethod(); if (!expectedInfo.getType().isAssignableFrom(itemType)) continue; if (calledMethod != null && calledMethod.equals(myPositionMethod) || isGetterSetterAssignment(object, calledMethod)) { hasRecursiveInvocations = true; } else if (calledMethod != null) { hasOtherInvocations = true; } } if (hasRecursiveInvocations && !hasOtherInvocations) { return myDelegate ? Result.delegation : Result.recursive; } } } if (myExpression != null) { return Result.normal; } if (object instanceof PsiMethod method && myPositionMethod != null && PsiTreeUtil.isAncestor(myReference, myPosition, false) && Objects.equals(method.getName(), myPositionMethod.getName())) { if (!myDelegate && findDeepestSuper(method).equals(findDeepestSuper(myPositionMethod))) { return Result.recursive; } return Result.delegation; } return Result.normal; }