applyEdit method
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();
}