textTransposeBackward function

TextCommandResult textTransposeBackward({
  1. required TextDocument document,
  2. required TextOffsetStateSnapshot state,
})

Implementation

TextCommandResult textTransposeBackward({
  required TextDocument document,
  required TextOffsetStateSnapshot state,
}) {
  final cursor = document.positionForOffset(state.cursorOffset);
  final lineLength = document.lineLength(cursor.line);
  if (lineLength == 0 || cursor.column == 0) {
    return _unchangedDocumentCommandResult(document, state);
  }

  final atColumn = math.min(cursor.column, lineLength - 1);
  final beforeColumn = atColumn - 1;
  if (beforeColumn < 0) {
    return _unchangedDocumentCommandResult(document, state);
  }

  final lineStartOffset = document.offsetForPosition(
    TextPosition(line: cursor.line, column: 0),
  );
  final beforeOffset = lineStartOffset + beforeColumn;
  final atOffset = lineStartOffset + atColumn;
  final beforeGrapheme = document.graphemeAt(beforeOffset);
  final atGrapheme = document.graphemeAt(atOffset);
  if (beforeGrapheme == null || atGrapheme == null) {
    return _unchangedDocumentCommandResult(document, state);
  }

  final working = document.copy();
  final result = edit_ops.replaceDocumentRange(
    working,
    start: beforeOffset,
    end: atOffset + 1,
    replacement: [atGrapheme, beforeGrapheme],
    cursorOffset: lineStartOffset + math.min(atColumn + 1, lineLength),
  );

  return _documentCommandResult(
    working,
    cursorOffset: result.cursorOffset,
    selectionBaseOffset: state.selectionBaseOffset,
    selectionExtentOffset: state.selectionExtentOffset,
    documentChange: result.change,
    changed: result.changed,
  );
}