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