@Nullable
      StringBuilder buildStringExpression(@NotNull PsiElement element, @NotNull CommentTracker tracker, @NonNls StringBuilder result) {
        if (currentLine < 0) {
          currentLine = getLineNumber(element);
        }
        if (element instanceof PsiNewExpression newExpression) {
          final PsiExpressionList argumentList = newExpression.getArgumentList();
          if (argumentList == null) {
            return null;
          }
          appendFormattedPlusIfNeeded(argumentList, result, "");
          final PsiExpression[] arguments = argumentList.getExpressions();
          if (arguments.length == 1 && !TypeUtils.typeEquals(STRING_JOINER, newExpression.getType())) {
            final PsiExpression argument = arguments[0];
            final PsiType type = argument.getType();
            if (!PsiTypes.intType().equals(type)) {
              if (type != null && type.equalsToText(JAVA_LANG_CHAR_SEQUENCE)) {
                result.append("String.valueOf(").append(tracker.textWithComments(argument)).append(')');
              }
              else {
                result.append(tracker.textWithComments(argument, ParenthesesUtils.ADDITIVE_PRECEDENCE));
              }
            }
          }
          return result;
        }
        for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
          if (child instanceof PsiExpressionList ||  child instanceof PsiWhiteSpace
              || child instanceof PsiJavaToken || child instanceof PsiReferenceParameterList) {
            continue;
          }
          if (buildStringExpression(child, tracker, result) == null) {
            return null;
          }
        }

        if (element instanceof PsiMethodCallExpression methodCallExpression) {
          final PsiExpressionList argumentList = methodCallExpression.getArgumentList();
          final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression();
          final String referenceName = methodExpression.getReferenceName();
          if ("toString".equals(referenceName)) {
            if (result.isEmpty()) {
              result.append("\"\"");
            }
          }
          else if ("append".equals(referenceName) || "add".equals(referenceName)){
            String commentsBefore = "";
            final ASTNode dot = ((CompositeElement)methodExpression.getNode()).findChildByRole(ChildRole.DOT);
            if (dot != null && !result.isEmpty()) {
              commentsBefore = tracker.commentsBefore(dot.getPsi());
            }
            final PsiExpression[] arguments = argumentList.getExpressions();
            if (arguments.length == 0) {
              return null;
            }
            if (arguments.length == 3) {
              final PsiExpression firstArg = arguments[0];
              appendFormattedPlusIfNeeded(argumentList, result, commentsBefore);
              if (TypeUtils.isJavaLangString(firstArg.getType())) {
                result.append(tracker.textWithComments(firstArg, PsiPrecedenceUtil.METHOD_CALL_PRECEDENCE))
                  .append(".substring(")
                  .append(tracker.textWithComments(arguments[1]))
                  .append(",")
                  .append(tracker.textWithComments(arguments[2]))
                  .append(")");
              } else {
                result.append("String.valueOf").append(tracker.textWithComments(argumentList));
              }
              return result;
            }
            final PsiExpression argument = arguments[0];
            final PsiType type = argument.getType();
            final String argumentText = tracker.textWithComments(argument);
            appendFormattedPlusIfNeeded(argument, result, commentsBefore);
            if (ParenthesesUtils.getPrecedence(argument) > ParenthesesUtils.ADDITIVE_PRECEDENCE ||
                (type instanceof PsiPrimitiveType && ParenthesesUtils.getPrecedence(argument) == ParenthesesUtils.ADDITIVE_PRECEDENCE)) {
              result.append('(').append(argumentText).append(')');
            }
            else if (type instanceof PsiArrayType) {
              result.append("String.valueOf(").append(argumentText).append(')');
            }
            else {
              if (StringUtil.startsWithChar(argumentText, '+')) {
                result.append(' ');
              }
              result.append(argumentText);
            }
          }
        }
        if (element instanceof PsiExpression expression && ExpressionUtils.isImplicitToStringCall(expression)) {
          if (result.isEmpty()) {
            result.append("\"\"");
          }
        }
        return result;
      }
@Nullable
      StringBuilder buildStringExpression(@NotNull PsiElement element, @NotNull CommentTracker tracker, @NonNls StringBuilder result)