@Override
  public Pair<PsiType, ConstraintType> inferTypeConstraintFromCallContext(PsiExpression innerMethodCall,
                                                                          PsiExpressionList expressionList,
                                                                          @NotNull PsiCallExpression contextCall,
                                                                          PsiTypeParameter typeParameter) {
    PsiExpression[] expressions = expressionList.getExpressions();
    PsiElement parent = innerMethodCall;
    while (parent.getParent() instanceof PsiParenthesizedExpression) {
      parent = parent.getParent();
    }
    int i = ArrayUtilRt.find(expressions, parent);
    if (i < 0) return null;
    PsiMethod owner = (PsiMethod)typeParameter.getOwner();
    if (owner == null) return null;

    try {
      final JavaResolveResult[] results = getResults(contextCall, i);
      final PsiType innerReturnType = owner.getReturnType();
      for (final JavaResolveResult result : results) {
        if (result == null) continue;
        final PsiSubstitutor substitutor = getSubstitutor(contextCall, expressions, i, result);
        final Pair<PsiType, ConstraintType> constraint = inferConstraint(typeParameter, innerMethodCall, i, innerReturnType, result, substitutor);
        if (constraint != null) return constraint;
      }
    }
    catch (MethodProcessorSetupFailedException ev) {
      return null;
    }

    return null;
  }
@Override
  public Pair<PsiType, ConstraintType> inferTypeConstraintFromCallContext(PsiExpression innerMethodCall,
                                                                          PsiExpressionList expressionList,
                                                                          @NotNull PsiCallExpression contextCall,
                                                                          PsiTypeParameter typeParameter)