applyEdit method

void applyEdit(
  1. TreeSitterInputEdit edit
)

Applies an edit expressed against the current input state.

Implementation

void applyEdit(TreeSitterInputEdit edit) {
  edit.validatePayload();
  RangeError.checkValidRange(edit.startByte, edit.oldEndByte, _byteLength);
  if (pointAtByte(edit.startByte) != edit.startPosition ||
      pointAtByte(edit.oldEndByte) != edit.oldEndPosition) {
    throw StateError('Edit points do not match the current input revision');
  }
  final inserted = edit.insertedBytes;
  final startUtf16 = edit.startUtf16 ?? utf16OffsetAtByte(edit.startByte);
  final oldEndUtf16 = edit.oldEndUtf16 ?? utf16OffsetAtByte(edit.oldEndByte);
  final expectedNewPoint = _traverse(edit.startPosition, inserted);
  if (expectedNewPoint != edit.newEndPosition) {
    throw StateError('newEndPosition does not match insertedText');
  }
  _updateLineStarts(
    edit,
    inserted,
    startUtf16: startUtf16,
    oldEndUtf16: oldEndUtf16,
  );

  final next = <Uint8List>[];
  var position = 0;
  var insertedAdded = false;
  for (final piece in _pieces) {
    final pieceEnd = position + piece.length;
    if (pieceEnd <= edit.startByte || position >= edit.oldEndByte) {
      if (!insertedAdded && position >= edit.oldEndByte) {
        if (inserted.isNotEmpty) next.add(inserted);
        insertedAdded = true;
      }
      next.add(piece);
    } else {
      if (position < edit.startByte) {
        next.add(Uint8List.sublistView(piece, 0, edit.startByte - position));
      }
      if (!insertedAdded) {
        if (inserted.isNotEmpty) next.add(inserted);
        insertedAdded = true;
      }
      if (pieceEnd > edit.oldEndByte) {
        next.add(Uint8List.sublistView(piece, edit.oldEndByte - position));
      }
    }
    position = pieceEnd;
  }
  if (!insertedAdded && inserted.isNotEmpty) next.add(inserted);
  _pieces = next.where((piece) => piece.isNotEmpty).toList(growable: true);
  if (_pieces.isEmpty) _pieces.add(Uint8List(0));
  _byteLength += edit.insertedByteLength - edit.deletedByteLength;
  _reindex();
}