private static @Nullable PyType getCallType(@NotNull List<@NotNull PyCallableType> callableTypes,
                                              @NotNull PyCallSiteExpression callSite,
                                              @NotNull TypeEvalContext context) {
    Map<Pair<ScopeOwner, Boolean>, List<PyCallableType>> callableByScopeBins = StreamEx.of(callableTypes)
      .filter(PyCallableType::isCallable)
      .groupingBy(type -> {
        PyCallable callable = type.getCallable();
        return Pair.create(ScopeUtil.getScopeOwner(callable), callable != null && PyiUtil.isOverload(callable, context));
      }, LinkedHashMap::new, Collectors.toList());

    return StreamEx.of(callableByScopeBins.values())
      .flatCollection(callables -> getSameScopeCallablesCallTypes(callables, callSite, context))
      .collect(PyTypeUtil.toUnion());
  }
private static @Nullable PyType getCallType(@NotNull List<@NotNull PyCallableType> callableTypes,
                                              @NotNull PyCallSiteExpression callSite,
                                              @NotNull TypeEvalContext context)