@NotNull
 @Override
 public VisualPosition build(@NotNull EditorPosition position) {
   int diff = myTargetLogical.column - position.logicalColumn;
   position.logicalColumn += diff;
   position.visualColumn += diff;
   position.offset += diff;
   return position.buildVisualPosition();
 }
  @Override
  public VisualPosition processSoftWrap(@NotNull EditorPosition position, SoftWrap softWrap) {
    position.visualColumn = softWrap.getIndentInColumns();
    position.softWrapColumnDiff += softWrap.getIndentInColumns();

    if (position.logicalLine < myTargetLogical.line
        || position.logicalColumn != myTargetLogical.column) {
      return null;
    }
    return position.buildVisualPosition();
  }
  @Override
  protected VisualPosition buildIfExceeds(EditorPosition context, TabData tabData) {
    if (context.logicalLine < myTargetLogical.line) {
      return null;
    }

    int diff = myTargetLogical.column - context.logicalColumn;
    if (diff >= tabData.widthInColumns) {
      return null;
    }

    context.logicalColumn += diff;
    context.visualColumn += diff;

    return context.buildVisualPosition();
  }
  @Override
  protected VisualPosition buildIfExceeds(EditorPosition position, int offset) {
    if (position.logicalLine < myTargetLogical.line) {
      return null;
    }

    int diff = myTargetLogical.column - position.logicalColumn;
    if (offset - position.offset < diff) {
      return null;
    }

    position.visualColumn += diff;
    // Don't update other dimensions like logical position and offset because we need only visual
    // position here.
    return position.buildVisualPosition();
  }