textTransformSelectionOrLine function

TextCommandResult textTransformSelectionOrLine({
  1. required TextDocument document,
  2. required TextOffsetStateSnapshot state,
  3. required String transform(
    1. String text
    ),
})

Implementation

TextCommandResult textTransformSelectionOrLine({
  required TextDocument document,
  required TextOffsetStateSnapshot state,
  required String Function(String text) transform,
}) {
  final cursor = document.positionForOffset(state.cursorOffset);
  final selection = normalizedSelectionRange(
    state.selectionBaseOffset,
    state.selectionExtentOffset,
  );
  final hasSelection = selection != null && selection.start != selection.end;
  final start = hasSelection
      ? selection.start
      : document.offsetForPosition(TextPosition(line: cursor.line, column: 0));
  final end = hasSelection
      ? selection.end
      : document.offsetForPosition(
          TextPosition(
            line: cursor.line,
            column: document.lineLength(cursor.line),
          ),
        );

  if (start == end) {
    return _unchangedDocumentCommandResult(document, state);
  }

  final original = document.textInRange(startOffset: start, endOffset: end);
  final transformed = transform(original);
  if (transformed == original) {
    return _unchangedDocumentCommandResult(document, state);
  }

  final working = document.copy();
  final result = edit_ops.replaceDocumentTextRange(
    working,
    start: start,
    end: end,
    replacement: transformed,
  );
  final nextExtent = result.change.newEndOffset;

  if (hasSelection) {
    return _documentCommandResult(
      working,
      cursorOffset: nextExtent,
      selectionBaseOffset: start,
      selectionExtentOffset: nextExtent,
      documentChange: result.change,
      changed: result.changed,
    );
  }

  final relativeCursor = (state.cursorOffset - start).clamp(
    0,
    transformed.characters.length,
  );
  return _documentCommandResult(
    working,
    cursorOffset: start + relativeCursor,
    documentChange: result.change,
    changed: result.changed,
  );
}