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