replaceLineTextRange method

TextDocumentChange replaceLineTextRange({
  1. required int startLine,
  2. required int endLine,
  3. required List<String> replacementLineTexts,
})

Implementation

TextDocumentChange replaceLineTextRange({
  required int startLine,
  required int endLine,
  required List<String> replacementLineTexts,
}) {
  final normalizedStart = startLine.clamp(0, _storage.lineCount);
  final normalizedEnd = endLine.clamp(normalizedStart, _storage.lineCount);
  final normalizedReplacement = replacementLineTexts.isEmpty
      ? const <String>[]
      : List<String>.from(replacementLineTexts, growable: false);

  final startOffset = lineStartOffset(normalizedStart);
  final oldEndOffset = lineStartOffset(normalizedEnd);
  final startPosition = positionForOffset(startOffset);
  final oldEndPosition = positionForOffset(oldEndOffset);
  if (_matchesLineTextRange(
    startLine: normalizedStart,
    endLine: normalizedEnd,
    replacementLineTexts: normalizedReplacement,
  )) {
    return TextDocumentChange(
      startOffset: startOffset,
      oldEndOffset: oldEndOffset,
      newEndOffset: oldEndOffset,
      startPosition: startPosition,
      oldEndPosition: oldEndPosition,
      newEndPosition: oldEndPosition,
    );
  }
  if (_storage.lineCount -
          (normalizedEnd - normalizedStart) +
          normalizedReplacement.length ==
      0) {
    _storage = _optimizedStorageFromLineTexts(const <String>[
      '',
    ], revision: _storage.revision + 1);
  } else {
    final replacementStorage = normalizedReplacement.isEmpty
        ? null
        : _appendBackedStorageFromLineTexts(normalizedReplacement);
    final nextSegments = <_TextDocumentStorageSegment>[
      if (normalizedStart > 0) _storage.slice(0, normalizedStart),
      if (replacementStorage != null)
        replacementStorage.slice(0, replacementStorage.lineCount),
      if (normalizedEnd < _storage.lineCount)
        _storage.slice(normalizedEnd, _storage.lineCount),
    ];
    _storage = _storageBuilder.fromSegments(
      nextSegments,
      revision: _storage.revision + 1,
    );
  }

  final newEndOffset = lineStartOffset(
    normalizedStart + normalizedReplacement.length,
  );
  return TextDocumentChange(
    startOffset: startOffset,
    oldEndOffset: oldEndOffset,
    newEndOffset: newEndOffset,
    startPosition: startPosition,
    oldEndPosition: oldEndPosition,
    newEndPosition: positionForOffset(newEndOffset),
  );
}