positionOf method
Implementation
GeneratedTreeSitterNodePosition positionOf(GeneratedTreeSitterNode node) {
var startByte = node.startByte;
var endByte = node.endByte;
var startPoint = node.startPoint;
var endPoint = node.endPoint;
for (final edit in appliedEdits) {
final expandsAtRightInsertionBoundary =
edit.startByte == edit.oldEndByte &&
edit.startByte == endByte &&
_intersects(
node,
GeneratedTreeSitterNodePosition(
startByte: startByte,
endByte: endByte,
startPoint: startPoint,
endPoint: endPoint,
),
edit,
);
final transformedStart = _transformPosition(
startByte,
startPoint,
edit,
affinityAfter: true,
);
var transformedEnd = _transformPosition(
endByte,
endPoint,
edit,
affinityAfter: expandsAtRightInsertionBoundary,
);
// Both boundaries of a subtree wholly swallowed by a replacement are
// collapsed at the new-end boundary. Keep this lookup O(edit-count):
// ordinary incremental edits query only the intersecting tree paths,
// so building a whole-tree absolute-position cache here would turn
// every keystroke into an O(document-nodes) operation.
if (transformedEnd.byte < transformedStart.byte ||
(transformedEnd.byte == transformedStart.byte &&
_pointLt(transformedEnd.point, transformedStart.point))) {
transformedEnd = transformedStart;
}
startByte = transformedStart.byte;
startPoint = transformedStart.point;
endByte = transformedEnd.byte;
endPoint = transformedEnd.point;
}
return GeneratedTreeSitterNodePosition(
startByte: startByte,
endByte: endByte,
startPoint: startPoint,
endPoint: endPoint,
);
}