public static @NotNull Map<PsiElement, Collection<PsiElement>> getCallers(@NotNull PyElement pyElement) {
    final MultiMap<PsiElement, PsiElement> callers = MultiMap.createOrderedSet();
    final Collection<UsageInfo> usages = findUsages(pyElement);

    for (UsageInfo usage : usages) {
      PsiElement element = usage.getElement();
      if (element == null) {
        continue;
      }

      element = element.getParent();
      while (element instanceof PyParenthesizedExpression) {
        element = element.getParent();
      }

      if (element instanceof PyCallExpression) {
        final PyExpression receiver = ((PyCallExpression)element).getReceiver(null);
        if (receiver instanceof PyCallExpression && ((PyCallExpression)receiver).isCalleeText(PyNames.SUPER)) {
          continue;
        }
        final PsiElement caller = PsiTreeUtil.getParentOfType(element, PyParameterList.class, PyFunction.class);
        if (caller instanceof PyFunction) {
          callers.putValue(caller, element);
        }
        else if (caller instanceof PyParameterList) {
          final PsiElement innerFunction = PsiTreeUtil.getParentOfType(caller, PyFunction.class);
          final PsiElement outerFunction = PsiTreeUtil.getParentOfType(innerFunction, PyFunction.class);
          if (innerFunction != null && outerFunction != null) {
            callers.putValue(outerFunction, element);
          }
        }
      }
    }

    return callers.freezeValues();
  }
public static @NotNull Map<PsiElement, Collection<PsiElement>> getCallers(@NotNull PyElement pyElement)