edit method

Returns an edited view of this tree while retaining reusable node identities. Positions are transformed lazily by the reuse cursor.

Implementation

GeneratedTreeSitterTree edit(TreeSitterInputEdit edit) {
  final metadata =
      Map<GeneratedTreeSitterNode, _EditedSubtreeMetadata>.identity()
        ..addAll(_editedSubtreeMetadata[this] ?? const {});
  _applySubtreeEdit(rootNode, edit, metadata);
  final changed = Set<GeneratedTreeSitterNode>.identity()
    ..addAll(changedNodes)
    ..addAll(
      metadata.entries
          .where((entry) => entry.value.hasChanges)
          .map((entry) => entry.key),
    );
  // Generated recovery/balancing nodes can contain source gaps that are not
  // represented by their stored child padding. Conservatively supplement
  // the exact relative edit overlay so an edited leaf across such a gap is
  // never reused.
  _markIntersecting(rootNode, edit, changed);
  final transformedTotal = _transformPosition(
    rootTotalEndByte,
    rootTotalEndPoint,
    edit,
    affinityAfter: true,
  );
  final result = GeneratedTreeSitterTree(
    rootNode,
    language: language,
    includedRanges: includedRanges,
    rootTotalEndByte: transformedTotal.byte,
    rootTotalEndPoint: transformedTotal.point,
    appliedEdits: <TreeSitterInputEdit>[...appliedEdits, edit],
    changedNodes: changed,
    reusedNodeCount: reusedNodeCount,
    lexedTokenCount: lexedTokenCount,
    changedRanges: changedRanges,
    parsePassCount: parsePassCount,
    parseActionCount: parseActionCount,
    lexedBytes: lexedBytes,
    reusedBytes: reusedBytes,
    reuseCursorVisitCount: reuseCursorVisitCount,
    firstLexedByte: firstLexedByte,
    lastLexedByte: lastLexedByte,
    reuseRejections: reuseRejections,
  );
  _editedSubtreeMetadata[result] = metadata;
  return result;
}