applyTextEditsToString function
Applies edits to content in-memory, bottom-to-top (omp's
applyTextEditsToString). Call sortAndValidateTextEdits first (this
function re-sorts defensively).
Implementation
String applyTextEditsToString(String content, List<LspTextEdit> edits) {
final lines = content.split('\n');
final sorted = sortAndValidateTextEdits(edits);
for (final edit in sorted) {
final start = edit.range.start;
final end = edit.range.end;
if (start.line >= lines.length || end.line >= lines.length) {
throw StateError(
'LSP edit range ${edit.range.format()} is out of bounds for a '
'${lines.length}-line file',
);
}
if (start.line == end.line) {
final line = lines[start.line];
lines[start.line] =
line.substring(0, start.character) +
edit.newText +
line.substring(end.character);
} else {
final startLine = lines[start.line];
final endLine = lines[end.line];
final merged =
startLine.substring(0, start.character) +
edit.newText +
endLine.substring(end.character);
lines.replaceRange(start.line, end.line + 1, merged.split('\n'));
}
}
return lines.join('\n');
}