private @Nullable IndentData createAlignmentIndent(IndentData indentFromParent, AbstractBlockWrapper child) {
    if (!child.getWhiteSpace().containsLineFeeds()) {
      return null;
    }

    AlignmentImpl alignment = getAlignmentAtStartOffset();
    if (alignment == null || alignment == child.getAlignment()) {
      return null;
    }
    
    AbstractBlockWrapper previous = child.getPreviousBlock();
    LeafBlockWrapper anchorOffsetBlock = alignment.getOffsetRespBlockBefore(child);
    if (anchorOffsetBlock != null && anchorOffsetBlock.getStartOffset() != getStartOffset()) {
      // Located on different lines.
      boolean onDifferentLines = false;
      for (LeafBlockWrapper b = anchorOffsetBlock.getNextBlock(); b != null && b.getStartOffset() < getStartOffset(); b = b.getNextBlock()) {
        if (b.getWhiteSpace().containsLineFeeds()) {
          onDifferentLines = true;
          break;
        }
      }

      if (!onDifferentLines) {
        return null;
      }
    }

    // There is no point in continuing processing if given child is the first block, i.e. there is no alignment-implied
    // offset to add to the given 'indent from parent'.
    if (previous == null) {
      return indentFromParent;
    }

    IndentData symbolsBeforeCurrent;
    if (anchorOffsetBlock == null) {
      symbolsBeforeCurrent = getNumberOfSymbolsBeforeBlock();
    }
    else {
      symbolsBeforeCurrent = anchorOffsetBlock.getNumberOfSymbolsBeforeBlock();
    }

    // Result is calculated as a number of symbols between the current composite parent block plus given 'indent from parent'.
    int indentSpaces = symbolsBeforeCurrent.getIndentSpaces() + indentFromParent.getSpaces() + indentFromParent.getIndentSpaces();
    return new IndentData(indentSpaces, symbolsBeforeCurrent.getSpaces());
  }
private @Nullable IndentData createAlignmentIndent(IndentData indentFromParent, AbstractBlockWrapper child)