private static HighlightInfo.Builder createIncompatibleCallHighlightInfo(@NotNull PsiExpressionList list,
                                                                           @NotNull MethodCandidateInfo candidateInfo,
                                                                           @NotNull Consumer<? super HighlightInfo.Builder> errorSink) {
    if (PsiTreeUtil.hasErrorElements(list)) return null;
    PsiMethod resolvedMethod = candidateInfo.getElement();
    PsiSubstitutor substitutor = candidateInfo.getSubstitutor();
    String methodName = HighlightMessageUtil.getSymbolName(resolvedMethod, substitutor);
    PsiClass parent = resolvedMethod.getContainingClass();
    String containerName = parent == null ? "" : HighlightMessageUtil.getSymbolName(parent, substitutor);
    String argTypes = buildArgTypesList(list, false);
    String description = JavaErrorBundle.message("wrong.method.arguments", methodName, containerName, argTypes);
    String toolTip = null;
    List<PsiExpression> mismatchedExpressions;
    if (parent != null) {
      PsiExpression[] expressions = list.getExpressions();
      PsiParameter[] parameters = resolvedMethod.getParameterList().getParameters();
      mismatchedExpressions = mismatchedArgs(expressions, substitutor, parameters, candidateInfo.isVarargs());
      if (mismatchedExpressions.size() == 1 && parameters.length > 0) {
        toolTip = createOneArgMismatchTooltip(candidateInfo, mismatchedExpressions, expressions, parameters);
      }
      if (toolTip == null) {
        if ((parameters.length == 0 || !parameters[parameters.length - 1].isVarArgs()) &&
            parameters.length != expressions.length) {
          toolTip = createMismatchedArgumentCountTooltip(parameters.length, expressions.length);
          description = JavaAnalysisBundle.message("arguments.count.mismatch", parameters.length, expressions.length);
        }
        else if (mismatchedExpressions.isEmpty()) {
          if (IncompleteModelUtil.isIncompleteModel(list)) return null;
          toolTip = XmlStringUtil.escapeString(description);
        }
        else {
          toolTip = createMismatchedArgumentsHtmlTooltip(candidateInfo, list);
        }
      }
    }
    else {
      mismatchedExpressions = Collections.emptyList();
      toolTip = XmlStringUtil.escapeString(description);
    }

    if (mismatchedExpressions.size() == list.getExpressions().length || mismatchedExpressions.isEmpty()) {
      if (list.getTextRange().isEmpty()) {
        return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
          .range(ObjectUtils.notNull(list.getPrevSibling(), list))
          .description(description)
          .escapedToolTip(toolTip);
      }
      return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(list).description(description).escapedToolTip(toolTip).navigationShift(1);
    }
    else {
      HighlightInfo.Builder highlightInfo = null;
      for (PsiExpression wrongArg : mismatchedExpressions) {
        HighlightInfo.Builder info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(wrongArg)
          .description(description)
          .escapedToolTip(toolTip);
        if (highlightInfo == null) {
          highlightInfo = info;
        }
        else {
          errorSink.accept(info);
        }
      }
      return highlightInfo;
    }
  }
private static HighlightInfo.Builder createIncompatibleCallHighlightInfo(@NotNull PsiExpressionList list,
                                                                           @NotNull MethodCandidateInfo candidateInfo,
                                                                           @NotNull Consumer<? super HighlightInfo.Builder> errorSink)