duplicateSelectedLinesAbove function

TextLineCommandResult duplicateSelectedLinesAbove(
  1. List<String> lines, {
  2. required TextPosition cursor,
  3. TextPosition? selectionBase,
  4. TextPosition? selectionExtent,
})

Implementation

TextLineCommandResult duplicateSelectedLinesAbove(
  List<String> lines, {
  required TextPosition cursor,
  TextPosition? selectionBase,
  TextPosition? selectionExtent,
}) {
  final lineTexts = lines.isEmpty ? <String>[''] : List<String>.from(lines);
  final clampedCursor = _clampPositionToLines(cursor, lineTexts);
  final clampedBase = selectionBase == null
      ? null
      : _clampPositionToLines(selectionBase, lineTexts);
  final clampedExtent = selectionExtent == null
      ? null
      : _clampPositionToLines(selectionExtent, lineTexts);
  final span = _selectedLineSpan(
    clampedCursor,
    selectionBase: clampedBase,
    selectionExtent: clampedExtent,
  );
  final startLine = span.startLine;
  final endLine = span.endLine;
  final blockHeight = endLine - startLine + 1;
  final duplicatedLines = lineTexts
      .sublist(startLine, endLine + 1)
      .map((line) => line)
      .toList(growable: false);
  lineTexts.insertAll(startLine, duplicatedLines);

  final nextCursor = _duplicateAbovePosition(
    clampedCursor,
    startLine: startLine,
    endLine: endLine,
    delta: blockHeight,
    lines: lineTexts,
  );
  final nextBase = selectionBase == null
      ? null
      : _duplicateAbovePosition(
          clampedBase!,
          startLine: startLine,
          endLine: endLine,
          delta: blockHeight,
          lines: lineTexts,
        );
  final nextExtent = selectionExtent == null
      ? null
      : _duplicateAbovePosition(
          clampedExtent!,
          startLine: startLine,
          endLine: endLine,
          delta: blockHeight,
          lines: lineTexts,
        );

  return _lineResultFromSnapshot(
    lineTexts,
    TextLineStateSnapshot(
      cursor: nextCursor,
      selectionBase: nextBase,
      selectionExtent: nextExtent,
    ),
  );
}