replaceLineTextRange method
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),
);
}