applyTextEditsToString function

String applyTextEditsToString(
  1. String content,
  2. List<LspTextEdit> edits
)

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');
}